﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОписаниеПеременных
Перем Документ; // ТабличныйДокумент
Перем ПодробныеСведенияОПравахДоступа; // Булево
#КонецОбласти

#Область ПрограммныйИнтерфейс

#Область ДляВызоваИзДругихПодсистем

// Задать настройки формы отчета.
//
// Параметры:
//   Форма - ФормаКлиентскогоПриложения
//         - Неопределено
//   КлючВарианта - Строка
//                - Неопределено
//   Настройки - см. ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию
//
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт

	Настройки.ФормироватьСразу = Истина;
	Настройки.События.ПередЗагрузкойНастроекВКомпоновщик = Истина;
	Настройки.События.ПриОпределенииИспользуемыхТаблиц = Истина;

КонецПроцедуры

// Вызывается перед загрузкой новых настроек. Используется для изменения СКД отчета.
//
// Параметры:
//   Контекст - Произвольный
//   КлючСхемы - Строка
//   КлючВарианта - Строка
//                - Неопределено
//   НовыеНастройкиКД - НастройкиКомпоновкиДанных
//                    - Неопределено
//   НовыеПользовательскиеНастройкиКД - ПользовательскиеНастройкиКомпоновкиДанных
//                                    - Неопределено
//
Процедура ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД,
	НовыеПользовательскиеНастройкиКД) Экспорт

	Если Не УправлениеДоступомСлужебный.УпрощенныйИнтерфейсНастройкиПравДоступа()
		Или Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда
		Возврат;
	КонецЕсли;

	Если КлючСхемы <> "1" Тогда
		КлючСхемы = "1";
		СхемаКД = ПолучитьМакет("МакетПараметров");
		Параметр = СхемаКД.Параметры.Найти("ПодробныеСведенияОПравахДоступа");
		Параметр.ОграничениеИспользования = Истина;
		МодульОтчетыСервер = ОбщегоНазначения.ОбщийМодуль("ОтчетыСервер");
		МодульОтчетыСервер.ПодключитьСхему(ЭтотОбъект, Контекст, СхемаКД, КлючСхемы);
	КонецЕсли;

КонецПроцедуры

// Параметры:
//   КлючВарианта - Строка
//                - Неопределено
//   ИспользуемыеТаблицы - Массив из Строка
//
Процедура ПриОпределенииИспользуемыхТаблиц(КлючВарианта, ИспользуемыеТаблицы) Экспорт

	ИспользуемыеТаблицы.Добавить(Метаданные.РегистрыСведений.ПраваРолей.ПолноеИмя());
	ИспользуемыеТаблицы.Добавить(Метаданные.Справочники.ПрофилиГруппДоступа.ПолноеИмя());
	ИспользуемыеТаблицы.Добавить(Метаданные.Справочники.ГруппыДоступа.ПолноеИмя());
	ИспользуемыеТаблицы.Добавить(Метаданные.РегистрыСведений.СоставыГруппПользователей.ПолноеИмя());

КонецПроцедуры

#КонецОбласти

#КонецОбласти

#Область ОбработчикиСобытий

// Параметры:
//  ДокументРезультат - ТабличныйДокумент
//  ДанныеРасшифровки - ДанныеРасшифровкиКомпоновкиДанных
//  СтандартнаяОбработка - Булево
//
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;

	Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда
		ТекстОшибки = НСтр("ru = 'Для формирования отчета в конфигурации необходима подсистема ""Варианты отчетов"".'");
		ВызватьИсключение ТекстОшибки;
	КонецЕсли;

	РегистрыСведений.ПраваРолей.ПроверитьДанныеРегистра();

	ПараметрыДанных = КомпоновщикНастроек.ПолучитьНастройки().ПараметрыДанных;
	ПользовательИлиГруппа = ОтборПользователь();
	ПодробныеСведенияОПравахДоступа = ПараметрыДанных.Элементы.Найти("ПодробныеСведенияОПравахДоступа").Значение;
	Если ТипЗнч(ПодробныеСведенияОПравахДоступа) <> Тип("Булево") Тогда
		ПодробныеСведенияОПравахДоступа = Ложь;
	КонецЕсли;

	Если Не ЗначениеЗаполнено(ПользовательИлиГруппа) Тогда
		ТекстОшибки = НСтр("ru = 'Откройте карточку пользователя, перейдите по ссылке ""Права доступа"",
						   |нажмите на кнопку ""Отчет по правам доступа"".'");
		ВызватьИсключение ТекстОшибки;
	КонецЕсли;

	Если ПользовательИлиГруппа <> Пользователи.АвторизованныйПользователь()
		И Не Пользователи.ЭтоПолноправныйПользователь() Тогда

		ТекстОшибки = НСтр("ru = 'Недостаточно прав для просмотра отчета.'");
		ВызватьИсключение ТекстОшибки;
	КонецЕсли;

	ВыводПравГруппы = ТипЗнч(ПользовательИлиГруппа) = Тип("СправочникСсылка.ГруппыПользователей") 
		Или ТипЗнч(ПользовательИлиГруппа) = Тип("СправочникСсылка.ГруппыВнешнихПользователей");
	УпрощенныйИнтерфейс = УправлениеДоступомСлужебный.УпрощенныйИнтерфейсНастройкиПравДоступа();

	Документ = ДокументРезультат;
	Макет = ПолучитьМакет("Макет");

	Свойства = Новый Структура;
	Свойства.Вставить("Ссылка", ПользовательИлиГруппа);

	ВывестиЗаголовокОтчета(Макет, Свойства, ПользовательИлиГруппа);
	
	// Вывод свойств пользователя ИБ для пользователя и внешнего пользователя.
	Если Не ВыводПравГруппы Тогда
		ВывестиСвойстваПользователяИБ(Макет, ПользовательИлиГруппа);
	КонецЕсли;
	
	// Отчет по правам администратора.
	Если ТипЗнч(ПользовательИлиГруппа) = Тип("СправочникСсылка.Пользователи") 
		Или ТипЗнч(ПользовательИлиГруппа) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда

		УстановитьПривилегированныйРежим(Истина);
		ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(
			ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПользовательИлиГруппа, "ИдентификаторПользователяИБ"));
		УстановитьПривилегированныйРежим(Ложь);

		Если ПользовательИБ <> Неопределено И Пользователи.ЭтоПолноправныйПользователь(ПользовательИБ, Истина) Тогда

			Область = Макет.ПолучитьОбласть("ПолноправныйПользователь");
			Документ.Вывести(Область, 1);
			Возврат;
		КонецЕсли;
	КонецЕсли;

	УстановитьПривилегированныйРежим(Истина);
	ВозможныеПрава = УправлениеДоступомСлужебный.ВозможныеПраваДляНастройкиПравОбъектов();
	РезультатыЗапроса = ВыбратьСведенияОПравахДоступа(ВозможныеПрава, ВыводПравГруппы, ПользовательИлиГруппа);

	Документ.НачатьАвтогруппировкуСтрок();

	Если ПодробныеСведенияОПравахДоступа Тогда
		ВывестиПодробныеСведенияОПравахДоступа(Макет, ПользовательИлиГруппа, РезультатыЗапроса[3], Свойства);
		ВывестиРолиПоПрофилям(Макет, ПользовательИлиГруппа, РезультатыЗапроса[5], Свойства);
	КонецЕсли;

	ВывестиДоступныеДляПросмотра(ВозможныеПрава, Макет, РезультатыЗапроса[9], УпрощенныйИнтерфейс);
	ВывестиДоступныеДляРедактирования(ВозможныеПрава, Макет, РезультатыЗапроса[10], УпрощенныйИнтерфейс);
	ВывестиПраваНаОтдельныеОбъекты(ВозможныеПрава, Макет, РезультатыЗапроса[6], ВыводПравГруппы);

	Документ.ЗакончитьАвтогруппировкуСтрок();

КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция ОтборПользователь()

	Отбор = КомпоновщикНастроек.ПолучитьНастройки().Отбор;
	Для Каждого Элемент Из Отбор.Элементы Цикл
		Если Элемент.Использование И Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Пользователь") Тогда
			Если Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно 
				Или Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке Тогда
				Возврат Элемент.ПравоеЗначение;
			Иначе
				Возврат Неопределено;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;

	Возврат Неопределено;

КонецФункции

Функция ВыбратьСведенияОПравахДоступа(Знач ВозможныеПрава, Знач ВыводПравГруппы, Знач ПользовательИлиГруппа)

	ВидыОграниченийПрав = Отчеты.АнализПравДоступа.ВидыОграниченийПрав(
		ТипЗнч(ПользовательИлиГруппа) = Тип("СправочникСсылка.ВнешниеПользователи") 
		Или ТипЗнч(ПользовательИлиГруппа) = Тип("СправочникСсылка.ГруппыВнешнихПользователей"));

	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Пользователь", ПользовательИлиГруппа);
	Запрос.УстановитьПараметр("ВыводПравГруппы", ВыводПравГруппы);
	Запрос.УстановитьПараметр("ВидыОграниченийПрав", ВидыОграниченийПрав);
	Запрос.УстановитьПараметр("ТипыВладельцевНастроекПрав", ВозможныеПрава.ТипыВладельцев);
	Запрос.УстановитьПараметр("ПраваРолейРасширений", УправлениеДоступомСлужебный.ПраваРолейРасширений());
	
	// АПК:96-выкл - №434 Использование ОБЪЕДИНИТЬ допустимо, так как строки не должны повторятся и это запрос для отчета.
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ПраваРолейРасширений.ОбъектМетаданных КАК ОбъектМетаданных,
	|	ПраваРолейРасширений.Роль КАК Роль,
	|	ПраваРолейРасширений.ПравоДобавление КАК ПравоДобавление,
	|	ПраваРолейРасширений.ПравоИзменение КАК ПравоИзменение,
	|	ПраваРолейРасширений.ПравоЧтениеБезОграничения КАК ПравоЧтениеБезОграничения,
	|	ПраваРолейРасширений.ПравоДобавлениеБезОграничения КАК ПравоДобавлениеБезОграничения,
	|	ПраваРолейРасширений.ПравоИзменениеБезОграничения КАК ПравоИзменениеБезОграничения,
	|	ПраваРолейРасширений.ПравоПросмотр КАК ПравоПросмотр,
	|	ПраваРолейРасширений.ПравоИнтерактивноеДобавление КАК ПравоИнтерактивноеДобавление,
	|	ПраваРолейРасширений.ПравоРедактирование КАК ПравоРедактирование,
	|	ПраваРолейРасширений.ВидИзмененияСтроки КАК ВидИзмененияСтроки
	|ПОМЕСТИТЬ ПраваРолейРасширений
	|ИЗ
	|	&ПраваРолейРасширений КАК ПраваРолейРасширений
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ПраваРолейРасширений.ОбъектМетаданных КАК ОбъектМетаданных,
	|	ПраваРолейРасширений.Роль КАК Роль,
	|	ПраваРолейРасширений.ПравоДобавление КАК ПравоДобавление,
	|	ПраваРолейРасширений.ПравоИзменение КАК ПравоИзменение,
	|	ПраваРолейРасширений.ПравоЧтениеБезОграничения КАК ПравоЧтениеБезОграничения,
	|	ПраваРолейРасширений.ПравоДобавлениеБезОграничения КАК ПравоДобавлениеБезОграничения,
	|	ПраваРолейРасширений.ПравоИзменениеБезОграничения КАК ПравоИзменениеБезОграничения,
	|	ПраваРолейРасширений.ПравоПросмотр КАК ПравоПросмотр,
	|	ПраваРолейРасширений.ПравоИнтерактивноеДобавление КАК ПравоИнтерактивноеДобавление,
	|	ПраваРолейРасширений.ПравоРедактирование КАК ПравоРедактирование
	|ПОМЕСТИТЬ ПраваРолей
	|ИЗ
	|	ПраваРолейРасширений КАК ПраваРолейРасширений
	|ГДЕ
	|	ПраваРолейРасширений.ВидИзмененияСтроки = 1
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ПраваРолей.ОбъектМетаданных,
	|	ПраваРолей.Роль,
	|	ПраваРолей.ПравоДобавление,
	|	ПраваРолей.ПравоИзменение,
	|	ПраваРолей.ПравоЧтениеБезОграничения,
	|	ПраваРолей.ПравоДобавлениеБезОграничения,
	|	ПраваРолей.ПравоИзменениеБезОграничения,
	|	ПраваРолей.ПравоПросмотр,
	|	ПраваРолей.ПравоИнтерактивноеДобавление,
	|	ПраваРолей.ПравоРедактирование
	|ИЗ
	|	РегистрСведений.ПраваРолей КАК ПраваРолей
	|		ЛЕВОЕ СОЕДИНЕНИЕ ПраваРолейРасширений КАК ПраваРолейРасширений
	|		ПО ПраваРолей.ОбъектМетаданных = ПраваРолейРасширений.ОбъектМетаданных
	|			И ПраваРолей.Роль = ПраваРолейРасширений.Роль
	|ГДЕ
	|	ПраваРолейРасширений.ОбъектМетаданных ЕСТЬ NULL
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ГруппыДоступа.Ссылка КАК ГруппаДоступа,
	|	ГруппыДоступа.Профиль КАК Профиль,
	|	ГруппыДоступаПользователи.Пользователь КАК Пользователь,
	|	НЕ ТИПЗНАЧЕНИЯ(ГруппыДоступаПользователи.Пользователь) В (
	|		ТИП(Справочник.Пользователи),
	|		ТИП(Справочник.ВнешниеПользователи)) КАК ГрупповоеУчастие,
	|	ГруппыДоступа.Ответственный КАК Ответственный
	|ПОМЕСТИТЬ ГруппыДоступаПользователя
	|ИЗ
	|	Справочник.ГруппыДоступа КАК ГруппыДоступа
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
	|		ПО ГруппыДоступа.Ссылка = ГруппыДоступаПользователи.Ссылка
	|			И (НЕ ГруппыДоступа.ПометкаУдаления)
	|			И (НЕ ГруппыДоступа.Профиль.ПометкаУдаления)
	|			И (ВЫБОР
	|				КОГДА &ВыводПравГруппы
	|					ТОГДА ГруппыДоступаПользователи.Пользователь = &Пользователь
	|				ИНАЧЕ ИСТИНА В
	|						(ВЫБРАТЬ ПЕРВЫЕ 1
	|							ИСТИНА
	|						ИЗ
	|							РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
	|						ГДЕ
	|							СоставыГруппПользователей.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь
	|							И СоставыГруппПользователей.Пользователь = &Пользователь)
	|			КОНЕЦ)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ГруппыДоступаПользователя.ГруппаДоступа КАК ГруппаДоступа,
	|	ПРЕДСТАВЛЕНИЕ(ГруппыДоступаПользователя.ГруппаДоступа) КАК ПредставлениеГруппыДоступа,
	|	ГруппыДоступаПользователя.Пользователь КАК Участник,
	|	ПРЕДСТАВЛЕНИЕ(ГруппыДоступаПользователя.Пользователь) КАК ПредставлениеУчастника,
	|	ГруппыДоступаПользователя.ГрупповоеУчастие КАК ГрупповоеУчастие,
	|	ГруппыДоступаПользователя.ГруппаДоступа.Ответственный КАК Ответственный,
	|	ПРЕДСТАВЛЕНИЕ(ГруппыДоступаПользователя.Ответственный) КАК ПредставлениеОтветственного,
	|	ГруппыДоступаПользователя.ГруппаДоступа.Комментарий КАК Комментарий,
	|	ГруппыДоступаПользователя.ГруппаДоступа.Профиль КАК Профиль,
	|	ПРЕДСТАВЛЕНИЕ(ГруппыДоступаПользователя.ГруппаДоступа.Профиль) КАК ПредставлениеПрофиля
	|ИЗ
	|	ГруппыДоступаПользователя КАК ГруппыДоступаПользователя
	|ИТОГИ
	|	МАКСИМУМ(Участник)
	|ПО
	|	ГруппаДоступа
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ГруппыДоступаПользователя.Профиль КАК Профиль
	|ПОМЕСТИТЬ ПрофилиПользователя
	|ИЗ
	|	ГруппыДоступаПользователя КАК ГруппыДоступаПользователя
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ПрофилиПользователя.Профиль КАК Профиль,
	|	ПРЕДСТАВЛЕНИЕ(ПрофилиПользователя.Профиль) КАК ПредставлениеПрофиля,
	|	РолиПрофилей.Роль.Имя КАК Роль,
	|	РолиПрофилей.Роль.Синоним КАК ПредставлениеРоли
	|ИЗ
	|	ПрофилиПользователя КАК ПрофилиПользователя
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей
	|		ПО ПрофилиПользователя.Профиль = РолиПрофилей.Ссылка
	|ИТОГИ
	|	МАКСИМУМ(Профиль),
	|	МАКСИМУМ(ПредставлениеПрофиля),
	|	МАКСИМУМ(Роль),
	|	МАКСИМУМ(ПредставлениеРоли)
	|ПО
	|	Профиль,
	|	Роль
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ТИПЗНАЧЕНИЯ(НастройкиПравОбъектов.Объект) КАК ТипОбъектов,
	|	НастройкиПравОбъектов.Объект КАК Объект,
	|	ЕСТЬNULL(НаследованиеНастроек.Наследовать, ИСТИНА) КАК Наследовать,
	|	ВЫБОР
	|		КОГДА ТИПЗНАЧЕНИЯ(НастройкиПравОбъектов.Пользователь) <> ТИП(Справочник.Пользователи)
	|				И ТИПЗНАЧЕНИЯ(НастройкиПравОбъектов.Пользователь) <> ТИП(Справочник.ВнешниеПользователи)
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК ГрупповоеУчастие,
	|	НастройкиПравОбъектов.Пользователь КАК Пользователь,
	|	ПРЕДСТАВЛЕНИЕ(НастройкиПравОбъектов.Пользователь) КАК ПользовательНаименование,
	|	НастройкиПравОбъектов.Право КАК Право,
	|	НастройкиПравОбъектов.ПравоЗапрещено КАК ПравоЗапрещено,
	|	НастройкиПравОбъектов.НаследованиеРазрешено КАК НаследованиеРазрешено
	|ИЗ
	|	РегистрСведений.НастройкиПравОбъектов КАК НастройкиПравОбъектов
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
	|		ПО (НаследованиеНастроек.Объект = НастройкиПравОбъектов.Объект)
	|			И (НаследованиеНастроек.Родитель = НастройкиПравОбъектов.Объект)
	|ГДЕ
	|	ВЫБОР
	|			КОГДА &ВыводПравГруппы
	|				ТОГДА НастройкиПравОбъектов.Пользователь = &Пользователь
	|			ИНАЧЕ ИСТИНА В
	|					(ВЫБРАТЬ ПЕРВЫЕ 1
	|						ИСТИНА
	|					ИЗ
	|						РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
	|					ГДЕ
	|						СоставыГруппПользователей.ГруппаПользователей = НастройкиПравОбъектов.Пользователь
	|						И СоставыГруппПользователей.Пользователь = &Пользователь)
	|		КОНЕЦ
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ТИПЗНАЧЕНИЯ(НаследованиеНастроек.Объект),
	|	НаследованиеНастроек.Объект,
	|	НаследованиеНастроек.Наследовать,
	|	ЛОЖЬ,
	|	НЕОПРЕДЕЛЕНО,
	|	"""",
	|	"""",
	|	НЕОПРЕДЕЛЕНО,
	|	НЕОПРЕДЕЛЕНО
	|ИЗ
	|	РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПравОбъектов
	|		ПО (НастройкиПравОбъектов.Объект = НаследованиеНастроек.Объект)
	|			И (НастройкиПравОбъектов.Объект = НаследованиеНастроек.Родитель)
	|ГДЕ
	|	НаследованиеНастроек.Объект = НаследованиеНастроек.Родитель
	|	И НаследованиеНастроек.Наследовать = ЛОЖЬ
	|	И НастройкиПравОбъектов.Объект ЕСТЬ NULL
	|ИТОГИ
	|	МАКСИМУМ(Наследовать),
	|	МАКСИМУМ(ГрупповоеУчастие),
	|	МАКСИМУМ(Пользователь),
	|	МАКСИМУМ(ПользовательНаименование),
	|	МАКСИМУМ(НаследованиеРазрешено)
	|ПО
	|	ТипОбъектов,
	|	Объект,
	|	Пользователь
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВидыОграниченийПрав.Таблица КАК Таблица,
	|	ВидыОграниченийПрав.Право КАК Право,
	|	ВидыОграниченийПрав.ВидДоступа КАК ВидДоступа,
	|	ВидыОграниченийПрав.Представление КАК ПредставлениеВидаДоступа
	|ПОМЕСТИТЬ ВидыОграниченийПрав
	|ИЗ
	|	&ВидыОграниченийПрав КАК ВидыОграниченийПрав
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ГруппыДоступаПользователя.Профиль КАК Профиль,
	|	ГруппыДоступаПользователя.ГруппаДоступа КАК ГруппаДоступа,
	|	ЕСТЬNULL(ГруппыДоступаВидыДоступа.ВидДоступа, НЕОПРЕДЕЛЕНО) КАК ВидДоступа,
	|	ЕСТЬNULL(ГруппыДоступаВидыДоступа.ВсеРазрешены, ЛОЖЬ) КАК ВсеРазрешены,
	|	ЕСТЬNULL(ГруппыДоступаЗначенияДоступа.ЗначениеДоступа, НЕОПРЕДЕЛЕНО) КАК ЗначениеДоступа
	|ПОМЕСТИТЬ ВидыИЗначенияДоступа
	|ИЗ
	|	ГруппыДоступаПользователя КАК ГруппыДоступаПользователя
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.ВидыДоступа КАК ГруппыДоступаВидыДоступа
	|		ПО (ГруппыДоступаВидыДоступа.Ссылка = ГруппыДоступаПользователя.ГруппаДоступа)
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.ЗначенияДоступа КАК ГруппыДоступаЗначенияДоступа
	|		ПО (ГруппыДоступаЗначенияДоступа.Ссылка = ГруппыДоступаВидыДоступа.Ссылка)
	|			И (ГруппыДоступаЗначенияДоступа.ВидДоступа = ГруппыДоступаВидыДоступа.ВидДоступа)
	|
	|ОБЪЕДИНИТЬ
	|
	|ВЫБРАТЬ
	|	ГруппыДоступаПользователя.Профиль,
	|	ГруппыДоступаПользователя.ГруппаДоступа,
	|	ПрофилиГруппДоступаВидыДоступа.ВидДоступа,
	|	ПрофилиГруппДоступаВидыДоступа.ВсеРазрешены,
	|	ЕСТЬNULL(ПрофилиГруппДоступаЗначенияДоступа.ЗначениеДоступа, НЕОПРЕДЕЛЕНО)
	|ИЗ
	|	ГруппыДоступаПользователя КАК ГруппыДоступаПользователя
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.ВидыДоступа КАК ПрофилиГруппДоступаВидыДоступа
	|		ПО (ПрофилиГруппДоступаВидыДоступа.Ссылка = ГруппыДоступаПользователя.Профиль)
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.ЗначенияДоступа КАК ПрофилиГруппДоступаЗначенияДоступа
	|		ПО (ПрофилиГруппДоступаЗначенияДоступа.Ссылка = ПрофилиГруппДоступаВидыДоступа.Ссылка)
	|			И (ПрофилиГруппДоступаЗначенияДоступа.ВидДоступа = ПрофилиГруппДоступаВидыДоступа.ВидДоступа)
	|ГДЕ
	|	ПрофилиГруппДоступаВидыДоступа.Предустановленный
	|
	|ОБЪЕДИНИТЬ
	|
	|ВЫБРАТЬ
	|	ГруппыДоступаПользователя.Профиль,
	|	ГруппыДоступаПользователя.ГруппаДоступа,
	|	ВидыДоступаНастройкиПрав.ЗначениеПустойСсылки,
	|	ЛОЖЬ,
	|	НЕОПРЕДЕЛЕНО
	|ИЗ
	|	ГруппыДоступаПользователя КАК ГруппыДоступаПользователя
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ИдентификаторыОбъектовМетаданных КАК ВидыДоступаНастройкиПрав
	|		ПО (ВидыДоступаНастройкиПрав.ЗначениеПустойСсылки В (&ТипыВладельцевНастроекПрав))
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ПраваРолейПрофилей.Таблица.Родитель.Имя КАК ВидОбъектов,
	|	ПраваРолейПрофилей.Таблица.Родитель.ПорядокКоллекции КАК ПорядокВидаОбъектов,
	|	ПраваРолейПрофилей.Таблица.ПолноеИмя КАК Таблица,
	|	ПраваРолейПрофилей.Таблица.Имя КАК Объект,
	|	ПраваРолейПрофилей.Таблица КАК ИдентификаторОбъектаМетаданных,
	|	ПраваРолейПрофилей.Профиль КАК Профиль,
	|	ПРЕДСТАВЛЕНИЕ(ПраваРолейПрофилей.Профиль) КАК ПредставлениеПрофиля,
	|	ПраваРолейПрофилей.Роль.Имя КАК Роль,
	|	ПраваРолейПрофилей.Роль.Синоним КАК ПредставлениеРоли,
	|	ПраваРолейПрофилей.ВидРолей КАК ВидРолей,
	|	ПраваРолейПрофилей.ПравоЧтениеБезОграничения КАК ПравоЧтениеБезОграничения,
	|	ПраваРолейПрофилей.ПравоПросмотр КАК ПравоПросмотр,
	|	ПраваРолейПрофилей.ГруппаДоступа КАК ГруппаДоступа,
	|	ПРЕДСТАВЛЕНИЕ(ПраваРолейПрофилей.ГруппаДоступа) КАК ПредставлениеГруппыДоступа,
	|	ПраваРолейПрофилей.ВидДоступа КАК ВидДоступа,
	|	ПраваРолейПрофилей.ПредставлениеВидаДоступа КАК ПредставлениеВидаДоступа,
	|	ПраваРолейПрофилей.ВсеРазрешены КАК ВсеРазрешены,
	|	ПраваРолейПрофилей.ЗначениеДоступа КАК ЗначениеДоступа,
	|	ПРЕДСТАВЛЕНИЕ(ПраваРолейПрофилей.ЗначениеДоступа) КАК ПредставлениеЗначенияДоступа
	|ИЗ
	|	(ВЫБРАТЬ
	|		ПраваРолей.ОбъектМетаданных КАК Таблица,
	|		РолиПрофилей.Ссылка КАК Профиль,
	|		ВЫБОР
	|			КОГДА ПраваРолей.ПравоПросмотр
	|					И ПраваРолей.ПравоЧтениеБезОграничения
	|				ТОГДА 0
	|			КОГДА НЕ ПраваРолей.ПравоПросмотр
	|					И ПраваРолей.ПравоЧтениеБезОграничения
	|				ТОГДА 1
	|			КОГДА ПраваРолей.ПравоПросмотр
	|					И НЕ ПраваРолей.ПравоЧтениеБезОграничения
	|				ТОГДА 2
	|			ИНАЧЕ 3
	|		КОНЕЦ КАК ВидРолей,
	|		ПраваРолей.Роль КАК Роль,
	|		ПраваРолей.ПравоЧтениеБезОграничения КАК ПравоЧтениеБезОграничения,
	|		ПраваРолей.ПравоПросмотр КАК ПравоПросмотр,
	|		НЕОПРЕДЕЛЕНО КАК ГруппаДоступа,
	|		НЕОПРЕДЕЛЕНО КАК ВидДоступа,
	|		"""" КАК ПредставлениеВидаДоступа,
	|		НЕОПРЕДЕЛЕНО КАК ВсеРазрешены,
	|		НЕОПРЕДЕЛЕНО КАК ЗначениеДоступа
	|	ИЗ
	|		ПраваРолей КАК ПраваРолей
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей
	|				ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПрофилиПользователя КАК ПрофилиПользователя
	|				ПО РолиПрофилей.Ссылка = ПрофилиПользователя.Профиль
	|			ПО ПраваРолей.Роль = РолиПрофилей.Роль
	|	
	|	ОБЪЕДИНИТЬ
	|	
	|	ВЫБРАТЬ
	|		ПраваРолей.ОбъектМетаданных,
	|		ПрофилиПользователя.Профиль,
	|		1000,
	|		"""",
	|		ЛОЖЬ,
	|		ЛОЖЬ,
	|		ВидыИЗначенияДоступа.ГруппаДоступа,
	|		ЕСТЬNULL(ВидыОграниченийПрав.ВидДоступа, НЕОПРЕДЕЛЕНО),
	|		ЕСТЬNULL(ВидыОграниченийПрав.ПредставлениеВидаДоступа, """"),
	|		ВидыИЗначенияДоступа.ВсеРазрешены,
	|		ВидыИЗначенияДоступа.ЗначениеДоступа
	|	ИЗ
	|		ПраваРолей КАК ПраваРолей
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей
	|				ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПрофилиПользователя КАК ПрофилиПользователя
	|				ПО РолиПрофилей.Ссылка = ПрофилиПользователя.Профиль
	|			ПО ПраваРолей.Роль = РолиПрофилей.Роль
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВидыИЗначенияДоступа КАК ВидыИЗначенияДоступа
	|			ПО (ПрофилиПользователя.Профиль = ВидыИЗначенияДоступа.Профиль)
	|			ЛЕВОЕ СОЕДИНЕНИЕ ВидыОграниченийПрав КАК ВидыОграниченийПрав
	|			ПО (ВидыОграниченийПрав.Таблица = ПраваРолей.ОбъектМетаданных)
	|				И (ВидыОграниченийПрав.Право = ""Чтение"")
	|				И (ВидыОграниченийПрав.ВидДоступа = ВидыИЗначенияДоступа.ВидДоступа)) КАК ПраваРолейПрофилей
	|ИТОГИ
	|	МАКСИМУМ(ПорядокВидаОбъектов),
	|	МАКСИМУМ(Таблица),
	|	МАКСИМУМ(ИдентификаторОбъектаМетаданных),
	|	МАКСИМУМ(ПредставлениеПрофиля),
	|	МАКСИМУМ(ПредставлениеРоли),
	|	МАКСИМУМ(ПравоЧтениеБезОграничения),
	|	МАКСИМУМ(ПравоПросмотр),
	|	МАКСИМУМ(ПредставлениеГруппыДоступа),
	|	МАКСИМУМ(ПредставлениеВидаДоступа),
	|	МАКСИМУМ(ВсеРазрешены)
	|ПО
	|	ВидОбъектов,
	|	Объект,
	|	Профиль,
	|	ВидРолей,
	|	Роль,
	|	ГруппаДоступа,
	|	ВидДоступа
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ПраваРолейПрофилей.Таблица.Родитель.Имя КАК ВидОбъектов,
	|	ПраваРолейПрофилей.Таблица.Родитель.ПорядокКоллекции КАК ПорядокВидаОбъектов,
	|	ПраваРолейПрофилей.Таблица.ПолноеИмя КАК Таблица,
	|	ПраваРолейПрофилей.Таблица.Имя КАК Объект,
	|	ПраваРолейПрофилей.Таблица КАК ИдентификаторОбъектаМетаданных,
	|	ПраваРолейПрофилей.Профиль КАК Профиль,
	|	ПРЕДСТАВЛЕНИЕ(ПраваРолейПрофилей.Профиль) КАК ПредставлениеПрофиля,
	|	ПраваРолейПрофилей.Роль.Имя КАК Роль,
	|	ПраваРолейПрофилей.Роль.Синоним КАК ПредставлениеРоли,
	|	ПраваРолейПрофилей.ВидРолей КАК ВидРолей,
	|	ПраваРолейПрофилей.ПравоДобавление КАК ПравоДобавление,
	|	ПраваРолейПрофилей.ПравоИзменение КАК ПравоИзменение,
	|	ПраваРолейПрофилей.ПравоДобавлениеБезОграничения КАК ПравоДобавлениеБезОграничения,
	|	ПраваРолейПрофилей.ПравоИзменениеБезОграничения КАК ПравоИзменениеБезОграничения,
	|	ПраваРолейПрофилей.ПравоИнтерактивноеДобавление КАК ПравоИнтерактивноеДобавление,
	|	ПраваРолейПрофилей.ПравоРедактирование КАК ПравоРедактирование,
	|	ПраваРолейПрофилей.ГруппаДоступа КАК ГруппаДоступа,
	|	ПРЕДСТАВЛЕНИЕ(ПраваРолейПрофилей.ГруппаДоступа) КАК ПредставлениеГруппыДоступа,
	|	ПраваРолейПрофилей.ВидДоступа КАК ВидДоступа,
	|	ПраваРолейПрофилей.ПредставлениеВидаДоступа КАК ПредставлениеВидаДоступа,
	|	ПраваРолейПрофилей.ВсеРазрешены КАК ВсеРазрешены,
	|	ПраваРолейПрофилей.ЗначениеДоступа КАК ЗначениеДоступа,
	|	ПРЕДСТАВЛЕНИЕ(ПраваРолейПрофилей.ЗначениеДоступа) КАК ПредставлениеЗначенияДоступа
	|ИЗ
	|	(ВЫБРАТЬ
	|		ПраваРолей.ОбъектМетаданных КАК Таблица,
	|		РолиПрофилей.Ссылка КАК Профиль,
	|		ВЫБОР
	|			КОГДА ПраваРолей.ПравоДобавлениеБезОграничения
	|					И ПраваРолей.ПравоИзменениеБезОграничения
	|				ТОГДА 0
	|			КОГДА НЕ ПраваРолей.ПравоДобавлениеБезОграничения
	|					И ПраваРолей.ПравоИзменениеБезОграничения
	|				ТОГДА 100
	|			КОГДА ПраваРолей.ПравоДобавлениеБезОграничения
	|					И НЕ ПраваРолей.ПравоИзменениеБезОграничения
	|				ТОГДА 200
	|			ИНАЧЕ 300
	|		КОНЕЦ + ВЫБОР
	|			КОГДА ПраваРолей.ПравоДобавление
	|					И ПраваРолей.ПравоИзменение
	|				ТОГДА 0
	|			КОГДА НЕ ПраваРолей.ПравоДобавление
	|					И ПраваРолей.ПравоИзменение
	|				ТОГДА 10
	|			КОГДА ПраваРолей.ПравоДобавление
	|					И НЕ ПраваРолей.ПравоИзменение
	|				ТОГДА 20
	|			ИНАЧЕ 30
	|		КОНЕЦ + ВЫБОР
	|			КОГДА ПраваРолей.ПравоИнтерактивноеДобавление
	|					И ПраваРолей.ПравоРедактирование
	|				ТОГДА 0
	|			КОГДА НЕ ПраваРолей.ПравоИнтерактивноеДобавление
	|					И ПраваРолей.ПравоРедактирование
	|				ТОГДА 1
	|			КОГДА ПраваРолей.ПравоИнтерактивноеДобавление
	|					И НЕ ПраваРолей.ПравоРедактирование
	|				ТОГДА 2
	|			ИНАЧЕ 3
	|		КОНЕЦ КАК ВидРолей,
	|		ПраваРолей.Роль КАК Роль,
	|		ПраваРолей.ПравоДобавление КАК ПравоДобавление,
	|		ПраваРолей.ПравоИзменение КАК ПравоИзменение,
	|		ПраваРолей.ПравоДобавлениеБезОграничения КАК ПравоДобавлениеБезОграничения,
	|		ПраваРолей.ПравоИзменениеБезОграничения КАК ПравоИзменениеБезОграничения,
	|		ПраваРолей.ПравоИнтерактивноеДобавление КАК ПравоИнтерактивноеДобавление,
	|		ПраваРолей.ПравоРедактирование КАК ПравоРедактирование,
	|		НЕОПРЕДЕЛЕНО КАК ГруппаДоступа,
	|		НЕОПРЕДЕЛЕНО КАК ВидДоступа,
	|		"""" КАК ПредставлениеВидаДоступа,
	|		НЕОПРЕДЕЛЕНО КАК ВсеРазрешены,
	|		НЕОПРЕДЕЛЕНО КАК ЗначениеДоступа
	|	ИЗ
	|		ПраваРолей КАК ПраваРолей
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей
	|				ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПрофилиПользователя КАК ПрофилиПользователя
	|				ПО РолиПрофилей.Ссылка = ПрофилиПользователя.Профиль
	|			ПО ПраваРолей.Роль = РолиПрофилей.Роль
	|				И (ПраваРолей.ПравоДобавление
	|					ИЛИ ПраваРолей.ПравоИзменение)
	|	
	|	ОБЪЕДИНИТЬ
	|	
	|	ВЫБРАТЬ
	|		ПраваРолей.ОбъектМетаданных,
	|		ПрофилиПользователя.Профиль,
	|		1000,
	|		"""",
	|		ЛОЖЬ,
	|		ЛОЖЬ,
	|		ЛОЖЬ,
	|		ЛОЖЬ,
	|		ЛОЖЬ,
	|		ЛОЖЬ,
	|		ВидыИЗначенияДоступа.ГруппаДоступа,
	|		ЕСТЬNULL(ВидыОграниченийПрав.ВидДоступа, НЕОПРЕДЕЛЕНО),
	|		ЕСТЬNULL(ВидыОграниченийПрав.ПредставлениеВидаДоступа, """"),
	|		ВидыИЗначенияДоступа.ВсеРазрешены,
	|		ВидыИЗначенияДоступа.ЗначениеДоступа
	|	ИЗ
	|		ПраваРолей КАК ПраваРолей
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей
	|				ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПрофилиПользователя КАК ПрофилиПользователя
	|				ПО РолиПрофилей.Ссылка = ПрофилиПользователя.Профиль
	|			ПО ПраваРолей.Роль = РолиПрофилей.Роль
	|				И (ПраваРолей.ПравоДобавление)
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВидыИЗначенияДоступа КАК ВидыИЗначенияДоступа
	|			ПО (ПрофилиПользователя.Профиль = ВидыИЗначенияДоступа.Профиль)
	|			ЛЕВОЕ СОЕДИНЕНИЕ ВидыОграниченийПрав КАК ВидыОграниченийПрав
	|			ПО (ВидыОграниченийПрав.Таблица = ПраваРолей.ОбъектМетаданных)
	|				И (ВидыОграниченийПрав.Право = ""Добавление"")
	|				И (ВидыОграниченийПрав.ВидДоступа = ВидыИЗначенияДоступа.ВидДоступа)
	|	
	|	ОБЪЕДИНИТЬ
	|	
	|	ВЫБРАТЬ
	|		ПраваРолей.ОбъектМетаданных,
	|		ПрофилиПользователя.Профиль,
	|		1000,
	|		"""",
	|		ЛОЖЬ,
	|		ЛОЖЬ,
	|		ЛОЖЬ,
	|		ЛОЖЬ,
	|		ЛОЖЬ,
	|		ЛОЖЬ,
	|		ВидыИЗначенияДоступа.ГруппаДоступа,
	|		ЕСТЬNULL(ВидыОграниченийПрав.ВидДоступа, НЕОПРЕДЕЛЕНО),
	|		ЕСТЬNULL(ВидыОграниченийПрав.ПредставлениеВидаДоступа, """"),
	|		ВидыИЗначенияДоступа.ВсеРазрешены,
	|		ВидыИЗначенияДоступа.ЗначениеДоступа
	|	ИЗ
	|		ПраваРолей КАК ПраваРолей
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей
	|				ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПрофилиПользователя КАК ПрофилиПользователя
	|				ПО РолиПрофилей.Ссылка = ПрофилиПользователя.Профиль
	|			ПО ПраваРолей.Роль = РолиПрофилей.Роль
	|				И (ПраваРолей.ПравоИзменение)
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВидыИЗначенияДоступа КАК ВидыИЗначенияДоступа
	|			ПО (ПрофилиПользователя.Профиль = ВидыИЗначенияДоступа.Профиль)
	|			ЛЕВОЕ СОЕДИНЕНИЕ ВидыОграниченийПрав КАК ВидыОграниченийПрав
	|			ПО (ВидыОграниченийПрав.Таблица = ПраваРолей.ОбъектМетаданных)
	|				И (ВидыОграниченийПрав.Право = ""Изменение"")
	|				И (ВидыОграниченийПрав.ВидДоступа = ВидыИЗначенияДоступа.ВидДоступа)) КАК ПраваРолейПрофилей
	|ИТОГИ
	|	МАКСИМУМ(ВидОбъектов),
	|	МАКСИМУМ(Таблица),
	|	МАКСИМУМ(ИдентификаторОбъектаМетаданных),
	|	МАКСИМУМ(ПредставлениеПрофиля),
	|	МАКСИМУМ(ПредставлениеРоли),
	|	МАКСИМУМ(ПравоДобавление),
	|	МАКСИМУМ(ПравоИзменение),
	|	МАКСИМУМ(ПравоДобавлениеБезОграничения),
	|	МАКСИМУМ(ПравоИзменениеБезОграничения),
	|	МАКСИМУМ(ПравоИнтерактивноеДобавление),
	|	МАКСИМУМ(ПравоРедактирование),
	|	МАКСИМУМ(ПредставлениеГруппыДоступа),
	|	МАКСИМУМ(ПредставлениеВидаДоступа),
	|	МАКСИМУМ(ВсеРазрешены)
	|ПО
	|	ВидОбъектов,
	|	Объект,
	|	Профиль,
	|	ВидРолей,
	|	Роль,
	|	ГруппаДоступа,
	|	ВидДоступа
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВидыИЗначенияДоступа.Профиль КАК Профиль,
	|	ВидыИЗначенияДоступа.ГруппаДоступа КАК ГруппаДоступа,
	|	ВидыИЗначенияДоступа.ВидДоступа КАК ВидДоступа,
	|	ВидыИЗначенияДоступа.ВсеРазрешены КАК ВсеРазрешены,
	|	ВидыИЗначенияДоступа.ЗначениеДоступа КАК ЗначениеДоступа
	|ИЗ
	|	ВидыИЗначенияДоступа КАК ВидыИЗначенияДоступа";
	// АПК:96-вкл.

	Возврат Запрос.ВыполнитьПакет();

КонецФункции

Процедура ВывестиДоступныеДляПросмотра(Знач ВозможныеПрава, Знач Макет, Знач РезультатЗапроса, Знач УпрощенныйИнтерфейс)
	
	ОбластьОтступ = Макет.ПолучитьОбласть("Отступ");
	ПраваОбъектов = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); // ДеревоЗначений
	
	ЗаполнитьПредставленияОбъектов(ПраваОбъектов);
	ПраваОбъектов.Строки.Сортировать(
		"ПорядокВидаОбъектов Возр,
		|ПредставлениеОбъекта Возр,
		|ПредставлениеПрофиля Возр,
		|ВидРолей Возр,
		|ПредставлениеРоли Возр,
		|ПредставлениеГруппыДоступа Возр,
		|ПредставлениеВидаДоступа Возр,
		|ПредставлениеЗначенияДоступа Возр",
		Истина);
	
	Область = Макет.ПолучитьОбласть("ПраваОбъектовГруппировка");
	Область.Параметры.ПредставлениеГруппировкиПравОбъектов = НСтр("ru = 'Просмотр объектов'");
	Документ.Вывести(Область, 1);
	Область = Макет.ПолучитьОбласть("ПросмотрОбъектовЛегенда");
	Документ.Вывести(Область, 2);
	
	ВладельцыНастроекПрав = ВозможныеПрава.ПоТипамСсылок;
	
	Для Каждого ОписаниеВидаОбъектов Из ПраваОбъектов.Строки Цикл
		Область = Макет.ПолучитьОбласть("ПраваОбъектовТаблицаЗаголовок");
		Если УпрощенныйИнтерфейс Тогда
			Область.Параметры.ПредставлениеПрофилиИлиГруппыДоступа = НСтр("ru = 'Профили'");
		Иначе
			Область.Параметры.ПредставлениеПрофилиИлиГруппыДоступа = НСтр("ru = 'Группы доступа'");
		КонецЕсли;
		Область.Параметры.Заполнить(ОписаниеВидаОбъектов);
		Документ.Вывести(Область, 2);
		
		Область = Макет.ПолучитьОбласть("ПраваОбъектовТаблицаЗаголовокДоп");
		Если ПодробныеСведенияОПравахДоступа Тогда
			Область.Параметры.ПредставлениеПрофилиИлиГруппыДоступа = НСтр("ru = '(профиль, роли)'");
		Иначе
			Область.Параметры.ПредставлениеПрофилиИлиГруппыДоступа = "";
		КонецЕсли;
		Область.Параметры.Заполнить(ОписаниеВидаОбъектов);
		Документ.Вывести(Область, 3);
		
		Для Каждого ОписаниеОбъекта Из ОписаниеВидаОбъектов.Строки Цикл
			НачальнаяСтрокаОбластиОбъекта = Неопределено;
			КонечнаяСтрокаОбластиОбъекта  = Неопределено;
			Область = Макет.ПолучитьОбласть("ПраваОбъектовТаблицаСтрока");
			
			Область.Параметры.ОткрытьФормуСписка = "ОткрытьФормуСписка: " + ОписаниеОбъекта.Таблица;
			
			Если ОписаниеОбъекта.ПравоЧтениеБезОграничения Тогда
				Если ОписаниеОбъекта.ПравоПросмотр Тогда
					УточнениеПредставленияОбъекта = НСтр("ru = '(просмотр, не ограничен)'");
				Иначе
					УточнениеПредставленияОбъекта = НСтр("ru = '(просмотр*, не ограничен)'");
				КонецЕсли;
			Иначе
				Если ОписаниеОбъекта.ПравоПросмотр Тогда
					УточнениеПредставленияОбъекта = НСтр("ru = '(просмотр, ограничен)'");
				Иначе
					УточнениеПредставленияОбъекта = НСтр("ru = '(просмотр*, ограничен)'");
				КонецЕсли;
			КонецЕсли;
			
			Область.Параметры.ПредставлениеОбъекта = ОписаниеОбъекта.ПредставлениеОбъекта + Символы.ПС 
				+ УточнениеПредставленияОбъекта;
			
			Для Каждого ОписаниеПрофиля Из ОписаниеОбъекта.Строки Цикл
				ПредставлениеРолейПрофиля = "";
				КоличествоРолей = 0;
				ВсеРолиСОграничением = Истина;
				Для Каждого ОписаниеВидаРолей Из ОписаниеПрофиля.Строки Цикл
					Если ОписаниеВидаРолей.ВидРолей < 1000 Тогда
						// Описание роли с/без ограничений.
						Для Каждого ОписаниеРоли Из ОписаниеВидаРолей.Строки Цикл
							
							Если ОписаниеВидаРолей.ПравоЧтениеБезОграничения Тогда
								ВсеРолиСОграничением = Ложь;
							КонецЕсли;
							
							Если Не ПодробныеСведенияОПравахДоступа Тогда
								Продолжить;
							КонецЕсли;
							
							Если ОписаниеВидаРолей.Строки.Количество() > 1
								И ОписаниеВидаРолей.Строки.Индекс(ОписаниеРоли) < ОписаниеВидаРолей.Строки.Количество() - 1 Тогда
								ПредставлениеРолейПрофиля = ПредставлениеРолейПрофиля + ОписаниеРоли.ПредставлениеРоли + ",";
								КоличествоРолей = КоличествоРолей + 1;
							КонецЕсли;
							
							Если ОписаниеВидаРолей.Строки.Индекс(ОписаниеРоли) = ОписаниеВидаРолей.Строки.Количество() - 1 Тогда
								ПредставлениеРолейПрофиля = ПредставлениеРолейПрофиля + ОписаниеРоли.ПредставлениеРоли + ",";
								КоличествоРолей = КоличествоРолей + 1;
							КонецЕсли;
							ПредставлениеРолейПрофиля = ПредставлениеРолейПрофиля + Символы.ПС;
						КонецЦикла;
					ИначеЕсли ОписаниеВидаРолей.Строки[0].Строки.Количество() > 0 Тогда
						// Описание ограничений доступа для ролей с ограничениями.
						Для Каждого ОписаниеГруппыДоступа Из ОписаниеВидаРолей.Строки[0].Строки Цикл
							Индекс = ОписаниеГруппыДоступа.Строки.Количество() - 1;
							Пока Индекс >= 0 Цикл
								Если ОписаниеГруппыДоступа.Строки[Индекс].ВидДоступа = Неопределено Тогда
									ОписаниеГруппыДоступа.Строки.Удалить(Индекс);
								КонецЕсли;
								Индекс = Индекс - 1;
							КонецЦикла;
							НачальнаяСтрокаОбластиГруппыДоступа = Неопределено;
							Если Область = Неопределено Тогда
								Область = Макет.ПолучитьОбласть("ПраваОбъектовТаблицаСтрока");
							КонецЕсли;
							Если УпрощенныйИнтерфейс Тогда
								Область.Параметры.ПрофильИлиГруппаДоступа = ОписаниеПрофиля.ГруппаДоступа;
								
								Область.Параметры.ПредставлениеПрофиляИлиГруппыДоступа =
								ОписаниеПрофиля.ПредставлениеГруппыДоступа;
							Иначе
								Область.Параметры.ПрофильИлиГруппаДоступа = ОписаниеГруппыДоступа.ГруппаДоступа;
								Если ПодробныеСведенияОПравахДоступа Тогда
									ПредставлениеРолейПрофиля = СокрЛП(ПредставлениеРолейПрофиля);
									
									Если ЗначениеЗаполнено(ПредставлениеРолейПрофиля)
										И СтрЗаканчиваетсяНа(ПредставлениеРолейПрофиля, ",") Тогда
										
										ПредставлениеРолейПрофиля = Лев(ПредставлениеРолейПрофиля, СтрДлина(ПредставлениеРолейПрофиля) - 1);
									КонецЕсли;
									
									Если КоличествоРолей > 1 Тогда
										УточнениеПредставленияГруппыДоступа = НСтр("ru = '(профиль: %1, роли:
											|%2)'")
									Иначе
										УточнениеПредставленияГруппыДоступа = НСтр("ru = '(профиль: %1, роль:
											|%2)'")
									КонецЕсли;
									
									Область.Параметры.ПредставлениеПрофиляИлиГруппыДоступа =
										ОписаниеГруппыДоступа.ПредставлениеГруппыДоступа + Символы.ПС
										+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(УточнениеПредставленияГруппыДоступа,
											ОписаниеПрофиля.ПредставлениеПрофиля,
											СокрЛП(ПредставлениеРолейПрофиля));
								Иначе
									Область.Параметры.ПредставлениеПрофиляИлиГруппыДоступа =
									ОписаниеГруппыДоступа.ПредставлениеГруппыДоступа;
								КонецЕсли;
							КонецЕсли;
							Если ВсеРолиСОграничением Тогда
								Если ПолучитьФункциональнуюОпцию("ОграничиватьДоступНаУровнеЗаписей") Тогда
									Для Каждого ОписаниеВидаДоступа Из ОписаниеГруппыДоступа.Строки Цикл
										Индекс = ОписаниеВидаДоступа.Строки.Количество()-1;
										Пока Индекс >= 0 Цикл
											Если ОписаниеВидаДоступа.Строки[Индекс].ЗначениеДоступа = Неопределено Тогда
												ОписаниеВидаДоступа.Строки.Удалить(Индекс);
											КонецЕсли;
											Индекс = Индекс - 1;
										КонецЦикла;
										// Получение новой области, если вид доступа не первый.
										Если Область = Неопределено Тогда
											Область = Макет.ПолучитьОбласть("ПраваОбъектовТаблицаСтрока");
										КонецЕсли;
										
										Область.Параметры.ВидДоступа = ОписаниеВидаДоступа.ВидДоступа;
										
										Область.Параметры.ПредставлениеВидаДоступа = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
											ШаблонПредставленияВидаДоступа(
											ОписаниеВидаДоступа, ВладельцыНастроекПрав),
											ОписаниеВидаДоступа.ПредставлениеВидаДоступа);
										
										ВывестиОбласть(Документ, Область, 3,
											НачальнаяСтрокаОбластиОбъекта,
											КонечнаяСтрокаОбластиОбъекта,
											НачальнаяСтрокаОбластиГруппыДоступа);
										
										Для Каждого ОписаниеЗначенияДоступа Из ОписаниеВидаДоступа.Строки Цикл
											Область = Макет.ПолучитьОбласть("ПраваОбъектовТаблицаСтрокаЗначенияДоступа");
											Область.Параметры.ПредставлениеЗначенияДоступа = ОписаниеЗначенияДоступа.ПредставлениеЗначенияДоступа;
											Область.Параметры.ЗначениеДоступа =	ОписаниеЗначенияДоступа.ЗначениеДоступа;
											
											ВывестиОбласть(Документ, Область, 3,
												НачальнаяСтрокаОбластиОбъекта,
												КонечнаяСтрокаОбластиОбъекта,
												НачальнаяСтрокаОбластиГруппыДоступа);
										КонецЦикла;
									КонецЦикла;
								КонецЕсли;
							КонецЕсли;
							Если Область <> Неопределено Тогда
								ВывестиОбласть(Документ, Область, 3,
									НачальнаяСтрокаОбластиОбъекта,
									КонечнаяСтрокаОбластиОбъекта,
									НачальнаяСтрокаОбластиГруппыДоступа);
							КонецЕсли;
							УстановитьГраницыВидовИЗначенийДоступа(Документ, НачальнаяСтрокаОбластиГруппыДоступа, 
								КонечнаяСтрокаОбластиОбъекта);

							ОбъединитьЯчейкиУстановитьГраницы(Документ,
								НачальнаяСтрокаОбластиГруппыДоступа,
								КонечнаяСтрокаОбластиОбъекта,
								3);
						КонецЦикла;
					КонецЕсли;
				КонецЦикла;
			КонецЦикла;
			ОбъединитьЯчейкиУстановитьГраницы(Документ, НачальнаяСтрокаОбластиОбъекта, КонечнаяСтрокаОбластиОбъекта, 2);
		КонецЦикла;
		Документ.Вывести(ОбластьОтступ, 3);
		Документ.Вывести(ОбластьОтступ, 3);
		Документ.Вывести(ОбластьОтступ, 3);
		Документ.Вывести(ОбластьОтступ, 3);
	КонецЦикла;
	Документ.Вывести(ОбластьОтступ, 2);
	Документ.Вывести(ОбластьОтступ, 2);

КонецПроцедуры

Процедура ВывестиДоступныеДляРедактирования(Знач ВозможныеПрава, Знач Макет, Знач РезультатЗапроса,
	Знач УпрощенныйИнтерфейс)

	ОбластьОтступ = Макет.ПолучитьОбласть("Отступ");
	ПраваОбъектов = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); // ДеревоЗначений
	
	ЗаполнитьПредставленияОбъектов(ПраваОбъектов);
	ПраваОбъектов.Строки.Сортировать(
		"ПорядокВидаОбъектов Возр,
		|ПредставлениеОбъекта Возр,
		|ПредставлениеПрофиля Возр,
		|ВидРолей Возр,
		|ПредставлениеРоли Возр,
		|ПредставлениеГруппыДоступа Возр,
		|ПредставлениеВидаДоступа Возр,
		|ПредставлениеЗначенияДоступа Возр", Истина);

	Область = Макет.ПолучитьОбласть("ПраваОбъектовГруппировка");
	Область.Параметры.ПредставлениеГруппировкиПравОбъектов = НСтр("ru = 'Редактирование объектов'");
	Документ.Вывести(Область, 1);
	Область = Макет.ПолучитьОбласть("РедактированиеОбъектовЛегенда");
	Документ.Вывести(Область, 2);

	Для Каждого ОписаниеВидаОбъектов Из ПраваОбъектов.Строки Цикл
		Область = Макет.ПолучитьОбласть("ПраваОбъектовТаблицаЗаголовок");
		Если УпрощенныйИнтерфейс Тогда
			Область.Параметры.ПредставлениеПрофилиИлиГруппыДоступа = НСтр("ru = 'Профили'");
		Иначе
			Область.Параметры.ПредставлениеПрофилиИлиГруппыДоступа = НСтр("ru = 'Группы доступа'");
		КонецЕсли;
		Область.Параметры.Заполнить(ОписаниеВидаОбъектов);
		Документ.Вывести(Область, 2);

		Область = Макет.ПолучитьОбласть("ПраваОбъектовТаблицаЗаголовокДоп");
		Если ПодробныеСведенияОПравахДоступа Тогда
			Область.Параметры.ПредставлениеПрофилиИлиГруппыДоступа = НСтр("ru = '(профиль, роли)'");
		Иначе
			Область.Параметры.ПредставлениеПрофилиИлиГруппыДоступа = "";
		КонецЕсли;
		Область.Параметры.Заполнить(ОписаниеВидаОбъектов);
		Документ.Вывести(Область, 3);

		ДобавлениеИспользуется = СтандартныеПодсистемыСервер.ЭтоТаблицаРегистра(ОписаниеВидаОбъектов.Таблица);

		Для Каждого ОписаниеОбъекта Из ОписаниеВидаОбъектов.Строки Цикл
			НачальнаяСтрокаОбластиОбъекта = Неопределено;
			КонечнаяСтрокаОбластиОбъекта  = Неопределено;
			Область = Макет.ПолучитьОбласть("ПраваОбъектовТаблицаСтрока");

			Область.Параметры.ОткрытьФормуСписка = "ОткрытьФормуСписка: " + ОписаниеОбъекта.Таблица;

			Если ДобавлениеИспользуется Тогда
				Если ОписаниеОбъекта.ПравоДобавление И ОписаниеОбъекта.ПравоИзменение Тогда
					Если ОписаниеОбъекта.ПравоДобавлениеБезОграничения И ОписаниеОбъекта.ПравоИзменениеБезОграничения Тогда
						Если ОписаниеОбъекта.ПравоИнтерактивноеДобавление И ОписаниеОбъекта.ПравоРедактирование Тогда
							УточнениеПредставленияОбъекта = НСтр("ru = '(добавление, не ограничено
																 |изменение, не ограничено)'");
						ИначеЕсли Не ОписаниеОбъекта.ПравоИнтерактивноеДобавление И ОписаниеОбъекта.ПравоРедактирование Тогда
							УточнениеПредставленияОбъекта = НСтр("ru = '(добавление*, не ограничено
																 |изменение, не ограничено)'");
						ИначеЕсли ОписаниеОбъекта.ПравоИнтерактивноеДобавление И Не ОписаниеОбъекта.ПравоРедактирование Тогда
							УточнениеПредставленияОбъекта = НСтр("ru = '(добавление, не ограничено
																 |изменение*, не ограничено)'");
						Иначе // Не ОписаниеОбъекта.ПравоИнтерактивноеДобавление И Не ОписаниеОбъекта.ПравоРедактирование
							УточнениеПредставленияОбъекта = НСтр("ru = '(добавление*, не ограничено
																 |изменение*, не ограничено)'");
						КонецЕсли;
					ИначеЕсли Не ОписаниеОбъекта.ПравоДобавлениеБезОграничения
						И ОписаниеОбъекта.ПравоИзменениеБезОграничения Тогда
						Если ОписаниеОбъекта.ПравоИнтерактивноеДобавление И ОписаниеОбъекта.ПравоРедактирование Тогда
							УточнениеПредставленияОбъекта = НСтр("ru = '(добавление, ограничено
																 |изменение, не ограничено)'");
						ИначеЕсли Не ОписаниеОбъекта.ПравоИнтерактивноеДобавление И ОписаниеОбъекта.ПравоРедактирование Тогда
							УточнениеПредставленияОбъекта = НСтр("ru = '(добавление*, ограничено
																 |изменение, не ограничено)'");
						ИначеЕсли ОписаниеОбъекта.ПравоИнтерактивноеДобавление И Не ОписаниеОбъекта.ПравоРедактирование Тогда
							УточнениеПредставленияОбъекта = НСтр("ru = '(добавление, ограничено
																 |изменение*, не ограничено)'");
						Иначе // Не ОписаниеОбъекта.ПравоИнтерактивноеДобавление И Не ОписаниеОбъекта.ПравоРедактирование
							УточнениеПредставленияОбъекта = НСтр("ru = '(добавление*, ограничено
																 |изменение*, не ограничено)'");
						КонецЕсли;
					ИначеЕсли ОписаниеОбъекта.ПравоДобавлениеБезОграничения И Не ОписаниеОбъекта.ПравоИзменениеБезОграничения Тогда
						Если ОписаниеОбъекта.ПравоИнтерактивноеДобавление И ОписаниеОбъекта.ПравоРедактирование Тогда
							УточнениеПредставленияОбъекта = НСтр("ru = '(добавление, не ограничено
																 |изменение, ограничено)'");
						ИначеЕсли Не ОписаниеОбъекта.ПравоИнтерактивноеДобавление И ОписаниеОбъекта.ПравоРедактирование Тогда
							УточнениеПредставленияОбъекта = НСтр("ru = '(добавление*, не ограничено
																 |изменение, ограничено)'");
						ИначеЕсли ОписаниеОбъекта.ПравоИнтерактивноеДобавление И Не ОписаниеОбъекта.ПравоРедактирование Тогда
							УточнениеПредставленияОбъекта = НСтр("ru = '(добавление, не ограничено
																 |изменение*, ограничено)'");
						Иначе // Не ОписаниеОбъекта.ПравоИнтерактивноеДобавление И Не ОписаниеОбъекта.ПравоРедактирование
							УточнениеПредставленияОбъекта = НСтр("ru = '(добавление*, не ограничено
																 |изменение*, ограничено)'");
						КонецЕсли;
					Иначе // Не ОписаниеОбъекта.ПравоДобавлениеБезОграничения И Не ОписаниеОбъекта.ПравоИзменениеБезОграничения
						Если ОписаниеОбъекта.ПравоИнтерактивноеДобавление И ОписаниеОбъекта.ПравоРедактирование Тогда
							УточнениеПредставленияОбъекта = НСтр("ru = '(добавление, ограничено
																 |изменение, ограничено)'");
						ИначеЕсли Не ОписаниеОбъекта.ПравоИнтерактивноеДобавление И ОписаниеОбъекта.ПравоРедактирование Тогда
							УточнениеПредставленияОбъекта = НСтр("ru = '(добавление*, ограничено
																 |изменение, ограничено)'");
						ИначеЕсли ОписаниеОбъекта.ПравоИнтерактивноеДобавление И Не ОписаниеОбъекта.ПравоРедактирование Тогда
							УточнениеПредставленияОбъекта = НСтр("ru = '(добавление, ограничено
																 |изменение*, ограничено)'");
						Иначе // Не ОписаниеОбъекта.ПравоИнтерактивноеДобавление И Не ОписаниеОбъекта.ПравоРедактирование
							УточнениеПредставленияОбъекта = НСтр("ru = '(добавление*, ограничено
																 |изменение*, ограничено)'");
						КонецЕсли;
					КонецЕсли;

				ИначеЕсли Не ОписаниеОбъекта.ПравоДобавление И ОписаниеОбъекта.ПравоИзменение Тогда

					Если ОписаниеОбъекта.ПравоИзменениеБезОграничения Тогда
						Если ОписаниеОбъекта.ПравоРедактирование Тогда
							УточнениеПредставленияОбъекта = НСтр("ru = '(добавление не доступно
																 |изменение, не ограничено)'");
						Иначе // Не ОписаниеОбъекта.ПравоРедактирование
							УточнениеПредставленияОбъекта = НСтр("ru = '(добавление не доступно
																 |изменение*, не ограничено)'");
						КонецЕсли;
					Иначе // Не ОписаниеОбъекта.ПравоИзменениеБезОграничения
						Если ОписаниеОбъекта.ПравоРедактирование Тогда
							УточнениеПредставленияОбъекта = НСтр("ru = '(добавление не доступно
																 |изменение, ограничено)'");
						Иначе // Не ОписаниеОбъекта.ПравоРедактирование
							УточнениеПредставленияОбъекта = НСтр("ru = '(добавление не доступно
																 |изменение*, ограничено)'");
						КонецЕсли;
					КонецЕсли;

				Иначе // Не ОписаниеОбъекта.ПравоДобавление И Не ОписаниеОбъекта.ПравоИзменение
					УточнениеПредставленияОбъекта = НСтр("ru = '(добавление не доступно
														 |изменение не доступно)'");
				КонецЕсли;
			Иначе
				Если ОписаниеОбъекта.ПравоИзменение Тогда
					Если ОписаниеОбъекта.ПравоИзменениеБезОграничения Тогда
						Если ОписаниеОбъекта.ПравоРедактирование Тогда
							УточнениеПредставленияОбъекта = НСтр("ru = '(изменение, не ограничено)'");
						Иначе // Не ОписаниеОбъекта.ПравоРедактирование
							УточнениеПредставленияОбъекта = НСтр("ru = '(изменение*, не ограничено)'");
						КонецЕсли;
					Иначе
						Если ОписаниеОбъекта.ПравоРедактирование Тогда
							УточнениеПредставленияОбъекта = НСтр("ru = '(изменение, ограничено)'");
						Иначе // Не ОписаниеОбъекта.ПравоРедактирование
							УточнениеПредставленияОбъекта = НСтр("ru = '(изменение*, ограничено)'");
						КонецЕсли;
					КонецЕсли;
				Иначе // Не ОписаниеОбъекта.ПравоИзменение
					УточнениеПредставленияОбъекта = НСтр("ru = '(изменение не доступно)'");
				КонецЕсли;
			КонецЕсли;

			Область.Параметры.ПредставлениеОбъекта = ОписаниеОбъекта.ПредставлениеОбъекта + Символы.ПС
				+ УточнениеПредставленияОбъекта;

			Для Каждого ОписаниеПрофиля Из ОписаниеОбъекта.Строки Цикл
				ПредставлениеРолейПрофиля = "";
				КоличествоРолей = 0;
				ВсеРолиСОграничением = Истина;
				Для Каждого ОписаниеВидаРолей Из ОписаниеПрофиля.Строки Цикл
					Если ОписаниеВидаРолей.ВидРолей < 1000 Тогда
						// Описание роли с/без ограничений.
						Для Каждого ОписаниеРоли Из ОписаниеВидаРолей.Строки Цикл

							Если ОписаниеВидаРолей.ПравоДобавлениеБезОграничения И ОписаниеВидаРолей.ПравоИзменениеБезОграничения Тогда
								ВсеРолиСОграничением = Ложь;
							КонецЕсли;

							Если Не ПодробныеСведенияОПравахДоступа Тогда
								Продолжить;
							КонецЕсли;

							Если ОписаниеВидаРолей.Строки.Количество() > 1 
								И ОписаниеВидаРолей.Строки.Индекс(ОписаниеРоли) < ОписаниеВидаРолей.Строки.Количество() - 1 Тогда
								ПредставлениеРолейПрофиля = ПредставлениеРолейПрофиля + ОписаниеРоли.ПредставлениеРоли + ",";
								КоличествоРолей = КоличествоРолей + 1;
							КонецЕсли;

							Если ОписаниеВидаРолей.Строки.Индекс(ОписаниеРоли) = ОписаниеВидаРолей.Строки.Количество() - 1 Тогда
								ПредставлениеРолейПрофиля = ПредставлениеРолейПрофиля + ОписаниеРоли.ПредставлениеРоли + ",";
								КоличествоРолей = КоличествоРолей + 1;
							КонецЕсли;
							ПредставлениеРолейПрофиля = ПредставлениеРолейПрофиля + Символы.ПС;
						КонецЦикла;
					ИначеЕсли ОписаниеВидаРолей.Строки[0].Строки.Количество() > 0 Тогда
						// Описание ограничений доступа для ролей с ограничениями.
						Для Каждого ОписаниеГруппыДоступа Из ОписаниеВидаРолей.Строки[0].Строки Цикл
							Индекс = ОписаниеГруппыДоступа.Строки.Количество() - 1;
							Пока Индекс >= 0 Цикл
								Если ОписаниеГруппыДоступа.Строки[Индекс].ВидДоступа = Неопределено Тогда
									ОписаниеГруппыДоступа.Строки.Удалить(Индекс);
								КонецЕсли;
								Индекс = Индекс - 1;
							КонецЦикла;
							НачальнаяСтрокаОбластиГруппыДоступа = Неопределено;
							Если Область = Неопределено Тогда
								Область = Макет.ПолучитьОбласть("ПраваОбъектовТаблицаСтрока");
							КонецЕсли;
							Если УпрощенныйИнтерфейс Тогда
								Область.Параметры.ПрофильИлиГруппаДоступа = ОписаниеПрофиля.ГруппаДоступа;
								Область.Параметры.ПредставлениеПрофиляИлиГруппыДоступа = ОписаниеПрофиля.ПредставлениеГруппыДоступа;
							Иначе
								Область.Параметры.ПрофильИлиГруппаДоступа = ОписаниеГруппыДоступа.ГруппаДоступа;
								Если ПодробныеСведенияОПравахДоступа Тогда
									ПредставлениеРолейПрофиля = СокрЛП(ПредставлениеРолейПрофиля);

									Если ЗначениеЗаполнено(ПредставлениеРолейПрофиля) 
										И СтрЗаканчиваетсяНа(ПредставлениеРолейПрофиля, ",") Тогда
										ПредставлениеРолейПрофиля = Лев(ПредставлениеРолейПрофиля, СтрДлина(ПредставлениеРолейПрофиля) - 1);
									КонецЕсли;
									Если КоличествоРолей > 1 Тогда
										УточнениеПредставленияГруппыДоступа = НСтр("ru = '(профиль: %1, роли:
																				   |%2)'");
									Иначе
										УточнениеПредставленияГруппыДоступа = НСтр("ru = '(профиль: %1, роль:
																				   |%2)'");
									КонецЕсли;

									Область.Параметры.ПредставлениеПрофиляИлиГруппыДоступа = ОписаниеГруппыДоступа.ПредставлениеГруппыДоступа
										+ Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
										УточнениеПредставленияГруппыДоступа, ОписаниеПрофиля.ПредставлениеПрофиля,
										СокрЛП(ПредставлениеРолейПрофиля));
								Иначе
									Область.Параметры.ПредставлениеПрофиляИлиГруппыДоступа = ОписаниеГруппыДоступа.ПредставлениеГруппыДоступа;
								КонецЕсли;
							КонецЕсли;
							Если ВсеРолиСОграничением Тогда
								Если ПолучитьФункциональнуюОпцию("ОграничиватьДоступНаУровнеЗаписей") Тогда
									Для Каждого ОписаниеВидаДоступа Из ОписаниеГруппыДоступа.Строки Цикл
										Индекс = ОписаниеВидаДоступа.Строки.Количество() - 1;
										Пока Индекс >= 0 Цикл
											Если ОписаниеВидаДоступа.Строки[Индекс].ЗначениеДоступа = Неопределено Тогда
												ОписаниеВидаДоступа.Строки.Удалить(Индекс);
											КонецЕсли;
											Индекс = Индекс - 1;
										КонецЦикла;
										// Получение новой области, если вид доступа не первый.
										Если Область = Неопределено Тогда
											Область = Макет.ПолучитьОбласть("ПраваОбъектовТаблицаСтрока");
										КонецЕсли;

										Область.Параметры.ВидДоступа = ОписаниеВидаДоступа.ВидДоступа;
										Область.Параметры.ПредставлениеВидаДоступа = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
											ШаблонПредставленияВидаДоступа(ОписаниеВидаДоступа,
											ВозможныеПрава.ПоТипамСсылок), ОписаниеВидаДоступа.ПредставлениеВидаДоступа);

										ВывестиОбласть(Документ, Область, 3, НачальнаяСтрокаОбластиОбъекта,
											КонечнаяСтрокаОбластиОбъекта, НачальнаяСтрокаОбластиГруппыДоступа);

										Для Каждого ОписаниеЗначенияДоступа Из ОписаниеВидаДоступа.Строки Цикл
											Область = Макет.ПолучитьОбласть("ПраваОбъектовТаблицаСтрокаЗначенияДоступа");
											Область.Параметры.ПредставлениеЗначенияДоступа = ОписаниеЗначенияДоступа.ПредставлениеЗначенияДоступа;
											Область.Параметры.ЗначениеДоступа = ОписаниеЗначенияДоступа.ЗначениеДоступа;

											ВывестиОбласть(Документ, Область, 3, НачальнаяСтрокаОбластиОбъекта,
												КонечнаяСтрокаОбластиОбъекта, НачальнаяСтрокаОбластиГруппыДоступа);
										КонецЦикла;
									КонецЦикла;
								КонецЕсли;
							КонецЕсли;
							Если Область <> Неопределено Тогда
								ВывестиОбласть(Документ, Область, 3, НачальнаяСтрокаОбластиОбъекта, КонечнаяСтрокаОбластиОбъекта,
									НачальнаяСтрокаОбластиГруппыДоступа);
							КонецЕсли;
							// Установка границы видов доступа текущей группы доступа.
							УстановитьГраницыВидовИЗначенийДоступа(Документ, НачальнаяСтрокаОбластиГруппыДоступа, 
								КонечнаяСтрокаОбластиОбъекта);
							
							// Объединение ячеек группы доступа и установка границы.
							ОбъединитьЯчейкиУстановитьГраницы(Документ, НачальнаяСтрокаОбластиГруппыДоступа, 
								КонечнаяСтрокаОбластиОбъекта, 3);
						КонецЦикла;
					КонецЕсли;
				КонецЦикла;
			КонецЦикла;
			// Объединение ячеек объекта и установка границы.
			ОбъединитьЯчейкиУстановитьГраницы(Документ, НачальнаяСтрокаОбластиОбъекта, КонечнаяСтрокаОбластиОбъекта, 2);
		КонецЦикла;
		Документ.Вывести(ОбластьОтступ, 3);
		Документ.Вывести(ОбластьОтступ, 3);
		Документ.Вывести(ОбластьОтступ, 3);
		Документ.Вывести(ОбластьОтступ, 3);
	КонецЦикла;
	Документ.Вывести(ОбластьОтступ, 2);
	Документ.Вывести(ОбластьОтступ, 2);

КонецПроцедуры

Процедура ЗаполнитьПредставленияОбъектов(ПраваОбъектов)
	
	ПраваОбъектов.Колонки.Добавить("ПредставлениеВидаОбъектов", Новый ОписаниеТипов("Строка"));
	ПраваОбъектов.Колонки.Добавить("ПредставлениеОбъекта", Новый ОписаниеТипов("Строка"));
	
	ИдентификаторыВидаМетаданных = ПраваОбъектов.Строки.ВыгрузитьКолонку("ИдентификаторОбъектаМетаданных");
	ВидыОбъектовМетаданных = ОбщегоНазначения.ОбъектыМетаданныхПоИдентификаторам(ИдентификаторыВидаМетаданных, Ложь);
	КоллекцииОбъектовМетаданных = СтандартныеПодсистемыПовтИсп.СвойстваКоллекцийОбъектовМетаданных();

	Для каждого ОписаниеВидаОбъектов Из ПраваОбъектов.Строки Цикл
		ОбъектМетаданных = ВидыОбъектовМетаданных[ОписаниеВидаОбъектов.ИдентификаторОбъектаМетаданных];
		Если ОбъектМетаданных <> Неопределено Тогда
			ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных);
			Если ИмяБазовогоТипа <> "" Тогда
				СвойстваКоллекции = КоллекцииОбъектовМетаданных.Найти(ИмяБазовогоТипа, "Имя");
				Если СвойстваКоллекции <> Неопределено Тогда 
					ОписаниеВидаОбъектов.ПредставлениеВидаОбъектов = СвойстваКоллекции.Синоним;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		Если Не ЗначениеЗаполнено(ОписаниеВидаОбъектов.ПредставлениеВидаОбъектов) Тогда
			ОписаниеВидаОбъектов.ПредставлениеВидаОбъектов = ОписаниеВидаОбъектов.ВидОбъектов;
		КонецЕсли;
		
		ИдентификаторыОбъектовМетаданных = ОписаниеВидаОбъектов.Строки.ВыгрузитьКолонку("ИдентификаторОбъектаМетаданных");
		ОбъектыМетаданных = ОбщегоНазначения.ОбъектыМетаданныхПоИдентификаторам(ИдентификаторыОбъектовМетаданных, Ложь);
		Для Каждого ОписаниеОбъекта Из ОписаниеВидаОбъектов.Строки Цикл
			ОбъектМетаданных = ОбъектыМетаданных[ОписаниеОбъекта.ИдентификаторОбъектаМетаданных];
			Если ОбъектМетаданных <> Неопределено Тогда
				ОписаниеОбъекта.ПредставлениеОбъекта = ОбъектМетаданных.Синоним;
			Иначе
				ОписаниеОбъекта.ПредставлениеОбъекта = НСтр("ru = 'не существует'") + " " + ОписаниеОбъекта.Таблица;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
		
КонецПроцедуры

Процедура ВывестиПраваНаОтдельныеОбъекты(Знач ВозможныеПрава, Знач Макет, Знач РезультатЗапроса, Знач ВыводПравГруппы)

	ОбластьОтступ = Макет.ПолучитьОбласть("Отступ");

	НастройкиПрав = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); // ТаблицаЗначений
	НастройкиПрав.Колонки.Добавить("ТипОбъектовПолноеИмя");
	НастройкиПрав.Колонки.Добавить("ПредставлениеВидаОбъектов");
	НастройкиПрав.Колонки.Добавить("ПолноеНаименование");

	Для Каждого ОписаниеТипаОбъектов Из НастройкиПрав.Строки Цикл
		МетаданныеТипа = Метаданные.НайтиПоТипу(ОписаниеТипаОбъектов.ТипОбъектов);
		ОписаниеТипаОбъектов.ТипОбъектовПолноеИмя      = МетаданныеТипа.ПолноеИмя();
		ОписаниеТипаОбъектов.ПредставлениеВидаОбъектов = МетаданныеТипа.Представление();
	КонецЦикла;
	НастройкиПрав.Строки.Сортировать("ПредставлениеВидаОбъектов Возр");

	Для Каждого ОписаниеТипаОбъектов Из НастройкиПрав.Строки Цикл

		ОписаниеПрав = ВозможныеПрава.ПоТипамСсылок.Получить(ОписаниеТипаОбъектов.ТипОбъектов);

		Если ВозможныеПрава.ИерархическиеТаблицы.Получить(ОписаниеТипаОбъектов.ТипОбъектов) = Неопределено Тогда
			КорневыеЭлементыТипаОбъектов = Неопределено;
		Иначе
			// @skip-check query-in-loop - Малый цикл из одной или двух итераций
			КорневыеЭлементыТипаОбъектов = КорневыеЭлементыТипаОбъектов(ОписаниеТипаОбъектов.ТипОбъектов);
		КонецЕсли;

		Для Каждого ОписаниеОбъекта Из ОписаниеТипаОбъектов.Строки Цикл
			ОписаниеОбъекта.ПолноеНаименование = ОписаниеОбъекта.Объект.ПолноеНаименование();
		КонецЦикла;
		ОписаниеТипаОбъектов.Строки.Сортировать("ПолноеНаименование Возр");

		Область = Макет.ПолучитьОбласть("НастройкиПравГруппировка");
		Область.Параметры.Заполнить(ОписаниеТипаОбъектов);
		Документ.Вывести(Область, 1);
		
		// Вывод легенды
		Область = Макет.ПолучитьОбласть("НастройкиПравЛегендаШапка");
		Документ.Вывести(Область, 2);
		Для Каждого ОписаниеПрава Из ОписаниеПрав Цикл
			ПредставленияПрава = РегистрыСведений.НастройкиПравОбъектов.ПредставлениеВозможногоПрава(ОписаниеПрава);
			Область = Макет.ПолучитьОбласть("НастройкиПравЛегендаСтрока");
			Область.Параметры.Заголовок = СтрЗаменить(ПредставленияПрава.Заголовок, Символы.ПС, " ");
			Область.Параметры.Подсказка = СтрЗаменить(ПредставленияПрава.Подсказка, Символы.ПС, " ");
			Документ.Вывести(Область, 2);
		КонецЦикла;

		ЗаголовокДляПодпапок = НСтр("ru = 'Для
									|подпапок'");
		ПодсказкаДляПодпапок = НСтр("ru = 'Права не только для текущей папки, но и для ее нижестоящих папок'");

		Область = Макет.ПолучитьОбласть("НастройкиПравЛегендаСтрока");
		Область.Параметры.Заголовок = СтрЗаменить(ЗаголовокДляПодпапок, Символы.ПС, " ");
		Область.Параметры.Подсказка = СтрЗаменить(ПодсказкаДляПодпапок, Символы.ПС, " ");
		Документ.Вывести(Область, 2);

		ЗаголовокНастройкаПолученаОтГруппы = НСтр("ru = 'Настройка прав получена от группы'");

		Область = Макет.ПолучитьОбласть("НастройкиПравЛегендаСтрокаНаследование");
		Область.Параметры.Подсказка = НСтр("ru = 'Наследование прав от вышестоящих папок'");
		Документ.Вывести(Область, 2);

		Документ.Вывести(ОбластьОтступ, 2);
		
		// Подготовка макета строки
		МакетШапки  = Новый ТабличныйДокумент;
		МакетСтроки = Новый ТабличныйДокумент;
		ВывестиГруппыПользователя = ОписаниеТипаОбъектов.ГрупповоеУчастие И Не ВыводПравГруппы;
		КоличествоКолонок = ОписаниеПрав.Количество() + ?(ВывестиГруппыПользователя, 2, 1);

		Для НомерКолонки = 1 По КоличествоКолонок Цикл
			НоваяЯчейкаШапки  = Макет.ПолучитьОбласть("НастройкиПравДеталиЯчейкаШапки");
			ЯчейкаШапки = МакетШапки.Присоединить(НоваяЯчейкаШапки);
			ЯчейкаШапки.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
			НоваяЯчейкаСтроки = Макет.ПолучитьОбласть("НастройкиПравДеталиЯчейкаСтроки");
			ЯчейкаСтроки = МакетСтроки.Присоединить(НоваяЯчейкаСтроки);
			ЯчейкаСтроки.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
		КонецЦикла;

		Если ВывестиГруппыПользователя Тогда
			ЯчейкаШапки.ГоризонтальноеПоложение  = ГоризонтальноеПоложение.Лево;
			ЯчейкаСтроки.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Лево;
		КонецЕсли;
		
		// Вывод шапки таблицы
		НомерЯчейкиДляПодпапок = "R1C" + Формат(ОписаниеПрав.Количество() + 1, "ЧГ=");

		МакетШапки.Область(НомерЯчейкиДляПодпапок).Текст = ЗаголовокДляПодпапок;
		МакетШапки.Область(НомерЯчейкиДляПодпапок).ШиринаКолонки = МаксимальнаяДлинаСтроки(
			МакетШапки.Область(НомерЯчейкиДляПодпапок).Текст);

		Смещение = 1;

		ТекущийНомерОбласти = Смещение;
		Для Каждого ОписаниеПрава Из ОписаниеПрав Цикл
			ПредставленияПрава = РегистрыСведений.НастройкиПравОбъектов.ПредставлениеВозможногоПрава(ОписаниеПрава);
			НомерЯчейки = "R1C" + Формат(ТекущийНомерОбласти, "ЧГ=");
			МакетШапки.Область(НомерЯчейки).Текст = ПредставленияПрава.Заголовок;
			МакетШапки.Область(НомерЯчейки).ШиринаКолонки = МаксимальнаяДлинаСтроки(ПредставленияПрава.Заголовок);
			ТекущийНомерОбласти = ТекущийНомерОбласти + 1;

			МакетСтроки.Область(НомерЯчейки).ШиринаКолонки = МакетШапки.Область(НомерЯчейки).ШиринаКолонки;
		КонецЦикла;

		Если ВывестиГруппыПользователя Тогда
			НомерЯчейкиДляГруппы = "R1C" + Формат(КоличествоКолонок, "ЧГ=");
			МакетШапки.Область(НомерЯчейкиДляГруппы).Текст = ЗаголовокНастройкаПолученаОтГруппы;
			МакетШапки.Область(НомерЯчейкиДляГруппы).ШиринаКолонки = 35;
		КонецЕсли;
		Документ.Вывести(МакетШапки, 2);

		ТекстДа  = НСтр("ru = 'Да'");
		ТекстНет = НСтр("ru = 'Нет'");
		
		// Вывод строк таблицы
		Для Каждого ОписаниеОбъекта Из ОписаниеТипаОбъектов.Строки Цикл

			Если КорневыеЭлементыТипаОбъектов = Неопределено Или КорневыеЭлементыТипаОбъектов.Получить(
				ОписаниеОбъекта.Объект) <> Неопределено Тогда
				Область = Макет.ПолучитьОбласть("НастройкиПравДеталиОбъект");

			ИначеЕсли ОписаниеОбъекта.Наследовать Тогда
				Область = Макет.ПолучитьОбласть("НастройкиПравДеталиОбъектНаследоватьДа");
			Иначе
				Область = Макет.ПолучитьОбласть("НастройкиПравДеталиОбъектНаследоватьНет");
			КонецЕсли;

			Область.Параметры.Заполнить(ОписаниеОбъекта);
			Документ.Вывести(Область, 2);
			Для Каждого ОписаниеПользователя Из ОписаниеОбъекта.Строки Цикл

				Для НомерОбластиПрава = 1 По КоличествоКолонок Цикл
					НомерЯчейки = "R1C" + Формат(НомерОбластиПрава, "ЧГ=");
					МакетСтроки.Область(НомерЯчейки).Текст = "";
				КонецЦикла;

				Если ТипЗнч(ОписаниеПользователя.НаследованиеРазрешено) = Тип("Булево") Тогда
					МакетСтроки.Область(НомерЯчейкиДляПодпапок).Текст = 
						?(ОписаниеПользователя.НаследованиеРазрешено, ТекстДа, ТекстНет);
				КонецЕсли;

				ПраваВладельца = ВозможныеПрава.ПоТипам.Получить(ОписаниеТипаОбъектов.ТипОбъектов);
				Для Каждого ОписаниеТекущегоПрава Из ОписаниеПользователя.Строки Цикл
					ПравоВладельца = ПраваВладельца.Получить(ОписаниеТекущегоПрава.Право);
					Если ПравоВладельца <> Неопределено Тогда
						НомерОбластиПрава = ПравоВладельца.ИндексПрава + Смещение;
						НомерЯчейки = "R1C" + Формат(НомерОбластиПрава, "ЧГ=");
						МакетСтроки.Область(НомерЯчейки).Текст = ?(
							ОписаниеТекущегоПрава.ПравоЗапрещено, ТекстНет, ТекстДа);
					КонецЕсли;
				КонецЦикла;
				Если ВывестиГруппыПользователя Тогда
					Если ОписаниеПользователя.ГрупповоеУчастие Тогда
						МакетСтроки.Область(НомерЯчейкиДляГруппы).Текст = ОписаниеПользователя.ПользовательНаименование;
						МакетСтроки.Область(НомерЯчейкиДляГруппы).ПараметрРасшифровки = "Пользователь";
						МакетСтроки.Параметры.Пользователь = ОписаниеПользователя.Пользователь;
					КонецЕсли;
				КонецЕсли;
				МакетСтроки.Область(НомерЯчейкиДляГруппы).ШиринаКолонки = 35;
				Документ.Вывести(МакетСтроки, 2);
			КонецЦикла;
		КонецЦикла;
	КонецЦикла;

КонецПроцедуры

Процедура ВывестиЗаголовокОтчета(Знач Макет, Свойства, Знач ПользовательИлиГруппа)

	Если ТипЗнч(ПользовательИлиГруппа) = Тип("СправочникСсылка.Пользователи") Тогда
		Свойства.Вставить("ЗаголовокОтчета", НСтр("ru = 'Отчет по правам пользователя'"));
		Свойства.Вставить("РолиПоПрофилямГруппировка", НСтр("ru = 'Роли пользователя по профилям'"));
		Свойства.Вставить("ПредставлениеОбъекта", НСтр("ru = 'Пользователь: %1'"));

	ИначеЕсли ТипЗнч(ПользовательИлиГруппа) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда
		Свойства.Вставить("ЗаголовокОтчета", НСтр("ru = 'Отчет по правам внешнего пользователя'"));
		Свойства.Вставить("РолиПоПрофилямГруппировка", НСтр("ru = 'Роли внешнего пользователя по профилям'"));
		Свойства.Вставить("ПредставлениеОбъекта", НСтр("ru = 'Внешний пользователь: %1'"));

	ИначеЕсли ТипЗнч(ПользовательИлиГруппа) = Тип("СправочникСсылка.ГруппыПользователей") Тогда
		Свойства.Вставить("ЗаголовокОтчета", НСтр("ru = 'Отчет по правам группы пользователей'"));
		Свойства.Вставить("РолиПоПрофилямГруппировка", НСтр("ru = 'Роли группы пользователей по профилям'"));
		Свойства.Вставить("ПредставлениеОбъекта", НСтр("ru = 'Группа пользователей: %1'"));
	Иначе
		Свойства.Вставить("ЗаголовокОтчета", НСтр("ru = 'Отчет по правам группы внешних пользователей'"));
		Свойства.Вставить("РолиПоПрофилямГруппировка", НСтр("ru = 'Роли группы внешних пользователей по профилям'"));
		Свойства.Вставить("ПредставлениеОбъекта", НСтр("ru = 'Группа внешних пользователей: %1'"));
	КонецЕсли;

	Свойства.ПредставлениеОбъекта = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		Свойства.ПредставлениеОбъекта, Строка(ПользовательИлиГруппа));
	
	// Вывод заголовка.
	Область = Макет.ПолучитьОбласть("Заголовок");
	Область.Параметры.Заполнить(Свойства);
	Документ.Вывести(Область);

КонецПроцедуры

Процедура ВывестиСвойстваПользователяИБ(Знач Макет, Знач ПользовательИлиГруппа)

	Документ.НачатьАвтогруппировкуСтрок();
	Документ.Вывести(Макет.ПолучитьОбласть("СвойстваПользователяИБГруппировка"), 1,, Истина);
	Область = Макет.ПолучитьОбласть("СвойстваПользователяИБДетали1");

	УстановитьПривилегированныйРежим(Истина);
	СвойстваПользователяИБ = Пользователи.СвойстваПользователяИБ(
		ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПользовательИлиГруппа, "ИдентификаторПользователяИБ"));
	УстановитьПривилегированныйРежим(Ложь);

	Если СвойстваПользователяИБ <> Неопределено Тогда
		Область.Параметры.ВходВПрограммуРазрешен = Пользователи.ВходВПрограммуРазрешен(
		СвойстваПользователяИБ);

		Документ.Вывести(Область, 2);

		Область = Макет.ПолучитьОбласть("СвойстваПользователяИБДетали2");
		Область.Параметры.Заполнить(СвойстваПользователяИБ);
		Область.Параметры.ЯзыкПредставление = ПредставлениеЯзыка(СвойстваПользователяИБ.Язык);
		Область.Параметры.РежимЗапускаПредставление = ПредставлениеРежимаЗапуска(СвойстваПользователяИБ.РежимЗапуска);
		Если Не ЗначениеЗаполнено(СвойстваПользователяИБ.ПользовательОС) Тогда
			Область.Параметры.ПользовательОС = НСтр("ru = 'Не указан'");
		КонецЕсли;
		Документ.Вывести(Область, 2);
	Иначе
		Область.Параметры.ВходВПрограммуРазрешен = Ложь;
		Документ.Вывести(Область, 2);
	КонецЕсли;
	Документ.ЗакончитьАвтогруппировкуСтрок();

КонецПроцедуры

Процедура ВывестиПодробныеСведенияОПравахДоступа(Знач Макет, ПользовательИлиГруппа, Знач РезультатЗапроса, Свойства)

	ОбластьОтступ = Макет.ПолучитьОбласть("Отступ");
	
	// Вывод групп доступа.
	ОписанияГруппДоступа = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам).Строки;
	ОднаПерсональнаяГруппа = ОписанияГруппДоступа.Количество() = 1 И ЗначениеЗаполнено(ОписанияГруппДоступа[0].Участник);

	Область = Макет.ПолучитьОбласть("ВсеГруппыДоступаГруппировка");
	Область.Параметры.Заполнить(Свойства);

	Если ОднаПерсональнаяГруппа Тогда
		Если ТипЗнч(ПользовательИлиГруппа) = Тип("СправочникСсылка.Пользователи") Тогда
			ПредставлениеДоступа = НСтр("ru = 'Ограничения доступа пользователя'");

		ИначеЕсли ТипЗнч(ПользовательИлиГруппа) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда
			ПредставлениеДоступа = НСтр("ru = 'Ограничения доступа внешнего пользователя'");

		ИначеЕсли ТипЗнч(ПользовательИлиГруппа) = Тип("СправочникСсылка.ГруппыПользователей") Тогда
			ПредставлениеДоступа = НСтр("ru = 'Ограничения доступа группы пользователей'");
		Иначе
			ПредставлениеДоступа = НСтр("ru = 'Ограничения доступа группы внешних пользователей'");
		КонецЕсли;
	Иначе
		Если ТипЗнч(ПользовательИлиГруппа) = Тип("СправочникСсылка.Пользователи") Тогда
			ПредставлениеДоступа = НСтр("ru = 'Группы доступа пользователя'");

		ИначеЕсли ТипЗнч(ПользовательИлиГруппа) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда
			ПредставлениеДоступа = НСтр("ru = 'Группы доступа внешнего пользователя'");

		ИначеЕсли ТипЗнч(ПользовательИлиГруппа) = Тип("СправочникСсылка.ГруппыПользователей") Тогда
			ПредставлениеДоступа = НСтр("ru = 'Группы доступа группы пользователей'");
		Иначе
			ПредставлениеДоступа = НСтр("ru = 'Группы доступа группы внешних пользователей'");
		КонецЕсли;
	КонецЕсли;

	Область.Параметры.ПредставлениеДоступа = ПредставлениеДоступа;

	Документ.Вывести(Область, 1);
	Документ.Вывести(ОбластьОтступ, 2);

	Для Каждого ОписаниеГруппыДоступа Из ОписанияГруппДоступа Цикл
		Если Не ОднаПерсональнаяГруппа Тогда
			Область = Макет.ПолучитьОбласть("ГруппаДоступаГруппировка");
			Область.Параметры.Заполнить(ОписаниеГруппыДоступа);
			Документ.Вывести(Область, 2);
		КонецЕсли;
		// Вывод случаев участия в группе.
		Если ОписаниеГруппыДоступа.Строки.Количество() = 1 И ОписаниеГруппыДоступа.Строки[0].Участник = ПользовательИлиГруппа Тогда
			// Пользователь входит в группу доступа только явно
			// поэтому вывод не требуется.
		Иначе
			Область = Макет.ПолучитьОбласть("ГруппаДоступаДеталиПользовательВходитВГруппу");
			Документ.Вывести(Область, 3);
			Если ОписаниеГруппыДоступа.Строки.Найти(ПользовательИлиГруппа, "Участник") <> Неопределено Тогда
				Область = Макет.ПолучитьОбласть("ГруппаДоступаДеталиПользовательВходитВГруппуЯвно");
				Документ.Вывести(Область, 3);
			КонецЕсли;
			Отбор = Новый Структура("ГрупповоеУчастие", Истина);
			ОписанияГруппПользователей = ОписаниеГруппыДоступа.Строки.НайтиСтроки(Отбор);
			
			Если ОписанияГруппПользователей.Количество() > 0 Тогда

				Область = Макет.ПолучитьОбласть("ГруппаДоступаДеталиПользовательВходитВГруппуКакУчастникГруппПользователей");
				Документ.Вывести(Область, 3);

				Для Каждого ОписаниеГруппыПользователя Из ОписанияГруппПользователей Цикл
					Область = Макет.ПолучитьОбласть("ГруппаДоступаДеталиПользовательВходитВГруппаКакПредставлениеУчастника");
					Область.Параметры.Заполнить(ОписаниеГруппыПользователя);
					Документ.Вывести(Область, 3);
				КонецЦикла;
			КонецЕсли;
		КонецЕсли;

		Если Не ОднаПерсональнаяГруппа Тогда
			// Вывод профиля.
			Область = Макет.ПолучитьОбласть("ГруппаДоступаДеталиПрофиль");
			Область.Параметры.Заполнить(ОписаниеГруппыДоступа);
			Документ.Вывести(Область, 3);
		КонецЕсли;
		
		// Вывод ответственного за состав участников.
		Если Не ОднаПерсональнаяГруппа И ЗначениеЗаполнено(ОписаниеГруппыДоступа.Ответственный) Тогда
			Область = Макет.ПолучитьОбласть("ГруппаДоступаДеталиОтветственный");
			Область.Параметры.Заполнить(ОписаниеГруппыДоступа);
			Документ.Вывести(Область, 3);
		КонецЕсли;
		
		// Вывод описания.
		Если Не ОднаПерсональнаяГруппа И ЗначениеЗаполнено(ОписаниеГруппыДоступа.Комментарий) Тогда
			Область = Макет.ПолучитьОбласть("ГруппаДоступаДеталиКомментарий");
			Область.Параметры.Заполнить(ОписаниеГруппыДоступа);
			Документ.Вывести(Область, 3);
		КонецЕсли;

		Документ.Вывести(ОбластьОтступ, 3);
		Документ.Вывести(ОбластьОтступ, 3);
	КонецЦикла;

КонецПроцедуры

Процедура ВывестиРолиПоПрофилям(Знач Макет, ПользовательИлиГруппа, Знач РезультатЗапроса, Свойства)

	ОбластьОтступ = Макет.ПолучитьОбласть("Отступ");
	РолиПоПрофилям = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
	РолиПоПрофилям.Строки.Сортировать("ПредставлениеПрофиля Возр, ПредставлениеРоли Возр");

	Если РолиПоПрофилям.Строки.Количество() > 0 Тогда
		Область = Макет.ПолучитьОбласть("РолиПоПрофилямГруппировка");
		Область.Параметры.Заполнить(Свойства);
		Документ.Вывести(Область, 1);
		Документ.Вывести(ОбластьОтступ, 2);

		Для Каждого ОписаниеПрофиля Из РолиПоПрофилям.Строки Цикл
			Область = Макет.ПолучитьОбласть("РолиПоПрофилямПрофильПредставление");
			Область.Параметры.Заполнить(ОписаниеПрофиля);
			Документ.Вывести(Область, 2);
			Для Каждого ОписаниеРоли Из ОписаниеПрофиля.Строки Цикл
				Область = Макет.ПолучитьОбласть("РолиПоПрофилямРольПредставление");
				Область.Параметры.Заполнить(ОписаниеРоли);
				Документ.Вывести(Область, 3);
			КонецЦикла;
		КонецЦикла;
	КонецЕсли;
	Документ.Вывести(ОбластьОтступ, 2);
	Документ.Вывести(ОбластьОтступ, 2);

КонецПроцедуры

Функция ШаблонПредставленияВидаДоступа(ОписаниеВидаДоступа, ВладельцыНастроекПрав)

	Если ОписаниеВидаДоступа.Строки.Количество() = 0 Тогда
		Если ВладельцыНастроекПрав.Получить(ТипЗнч(ОписаниеВидаДоступа.ВидДоступа)) <> Неопределено Тогда
			ШаблонПредставленияВидаДоступа = "%1";

		ИначеЕсли ОписаниеВидаДоступа.ВсеРазрешены Тогда
			Если ОписаниеВидаДоступа.ВидДоступа = Справочники.Пользователи.ПустаяСсылка() Тогда
				ШаблонПредставленияВидаДоступа = НСтр("ru = '%1 (без запрещенных, текущий пользователь всегда разрешен)'");

			ИначеЕсли ОписаниеВидаДоступа.ВидДоступа = Справочники.ВнешниеПользователи.ПустаяСсылка() Тогда
				ШаблонПредставленияВидаДоступа = НСтр("ru = '%1 (без запрещенных, текущий внешний пользователь всегда разрешен)'");
			Иначе
				ШаблонПредставленияВидаДоступа = НСтр("ru = '%1 (без запрещенных)'");
			КонецЕсли;
		Иначе
			Если ОписаниеВидаДоступа.ВидДоступа = Справочники.Пользователи.ПустаяСсылка() Тогда
				ШаблонПредставленияВидаДоступа = НСтр("ru = '%1 (без разрешенных, текущий пользователь всегда разрешен)'");

			ИначеЕсли ОписаниеВидаДоступа.ВидДоступа = Справочники.ВнешниеПользователи.ПустаяСсылка() Тогда
				ШаблонПредставленияВидаДоступа = НСтр("ru = '%1 (без разрешенных, текущий внешний пользователь всегда разрешен)'");
			Иначе
				ШаблонПредставленияВидаДоступа = НСтр("ru = '%1 (без разрешенных)'");
			КонецЕсли;
		КонецЕсли;
	Иначе
		Если ОписаниеВидаДоступа.ВсеРазрешены Тогда
			Если ОписаниеВидаДоступа.ВидДоступа = Справочники.Пользователи.ПустаяСсылка() Тогда
				ШаблонПредставленияВидаДоступа = НСтр("ru = '%1 (запрещенные, текущий пользователь всегда разрешен):'");

			ИначеЕсли ОписаниеВидаДоступа.ВидДоступа = Справочники.ВнешниеПользователи.ПустаяСсылка() Тогда
				ШаблонПредставленияВидаДоступа = НСтр("ru = '%1 (запрещенные, текущий внешний пользователь всегда разрешен):'");
			Иначе
				ШаблонПредставленияВидаДоступа = НСтр("ru = '%1 (запрещенные):'");
			КонецЕсли;
		Иначе
			Если ОписаниеВидаДоступа.ВидДоступа = Справочники.Пользователи.ПустаяСсылка() Тогда
				ШаблонПредставленияВидаДоступа = НСтр("ru = '%1 (разрешенные, текущий пользователь всегда разрешен):'");

			ИначеЕсли ОписаниеВидаДоступа.ВидДоступа = Справочники.ВнешниеПользователи.ПустаяСсылка() Тогда
				ШаблонПредставленияВидаДоступа = НСтр("ru = '%1 (разрешенные, текущий внешний пользователь всегда разрешен):'");
			Иначе
				ШаблонПредставленияВидаДоступа = НСтр("ru = '%1 (разрешенные):'");
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;

	Возврат ШаблонПредставленияВидаДоступа;

КонецФункции

Процедура ВывестиОбласть(Знач Документ, Область, Уровень, НачальнаяСтрокаОбластиОбъекта, КонечнаяСтрокаОбластиОбъекта,
	НачальнаяСтрокаОбластиГруппыДоступа)

	Если НачальнаяСтрокаОбластиОбъекта = Неопределено Тогда
		НачальнаяСтрокаОбластиОбъекта = Документ.Вывести(Область, Уровень);
		КонечнаяСтрокаОбластиОбъекта  = НачальнаяСтрокаОбластиОбъекта;
	Иначе
		КонечнаяСтрокаОбластиОбъекта = Документ.Вывести(Область);
	КонецЕсли;

	Если НачальнаяСтрокаОбластиГруппыДоступа = Неопределено Тогда
		НачальнаяСтрокаОбластиГруппыДоступа = КонечнаяСтрокаОбластиОбъекта;
	КонецЕсли;

	Область = Неопределено;

КонецПроцедуры

Процедура ОбъединитьЯчейкиУстановитьГраницы(Знач Документ, Знач НачальнаяСтрокаОбласти, Знач КонечнаяСтрокаОбласти,
	Знач НомерКолонки)

	Область = Документ.Область(НачальнаяСтрокаОбласти.Верх, НомерКолонки, КонечнаяСтрокаОбласти.Низ, НомерКолонки);
	Область.Объединить();

	ЛинияГраницы = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Точечная);

	Область.ГраницаСверху = ЛинияГраницы;
	Область.ГраницаСнизу  = ЛинияГраницы;

КонецПроцедуры

Процедура УстановитьГраницыВидовИЗначенийДоступа(Знач Документ, Знач НачальнаяСтрокаОбластиГруппыДоступа,
	Знач КонечнаяСтрокаОбластиОбъекта)

	ЛинияГраницы = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Точечная);

	Область = Документ.Область(НачальнаяСтрокаОбластиГруппыДоступа.Верх, 4, НачальнаяСтрокаОбластиГруппыДоступа.Верх, 5);
	Область.ГраницаСверху = ЛинияГраницы;

	Область = Документ.Область(КонечнаяСтрокаОбластиОбъекта.Низ, 4, КонечнаяСтрокаОбластиОбъекта.Низ, 5);
	Область.ГраницаСнизу = ЛинияГраницы;

КонецПроцедуры

Функция ПредставлениеРежимаЗапуска(РежимЗапуска)

	Если РежимЗапуска = "Авто" Тогда
		ПредставлениеРежимаЗапуска = НСтр("ru = 'Авто'");

	ИначеЕсли РежимЗапуска = "ОбычноеПриложение" Тогда
		ПредставлениеРежимаЗапуска = НСтр("ru = 'Обычное приложение'");

	ИначеЕсли РежимЗапуска = "УправляемоеПриложение" Тогда
		ПредставлениеРежимаЗапуска = НСтр("ru = 'Управляемое приложение'");
	Иначе
		ПредставлениеРежимаЗапуска = "";
	КонецЕсли;

	Возврат ПредставлениеРежимаЗапуска;

КонецФункции

Функция ПредставлениеЯзыка(Язык)

	ПредставлениеЯзыка = "";

	Для Каждого МетаданныеЯзыка Из Метаданные.Языки Цикл

		Если МетаданныеЯзыка.Имя = Язык Тогда
			ПредставлениеЯзыка = МетаданныеЯзыка.Синоним;
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Возврат ПредставлениеЯзыка;

КонецФункции

Функция МаксимальнаяДлинаСтроки(МногострочнаяСтрока, НачальнаяДлина = 5)

	Для НомерСтроки = 1 По СтрЧислоСтрок(МногострочнаяСтрока) Цикл
		ДлинаПодстроки = СтрДлина(СтрПолучитьСтроку(МногострочнаяСтрока, НомерСтроки));
		Если НачальнаяДлина < ДлинаПодстроки Тогда
			НачальнаяДлина = ДлинаПодстроки;
		КонецЕсли;
	КонецЦикла;

	Возврат НачальнаяДлина + 1;

КонецФункции

Функция КорневыеЭлементыТипаОбъектов(ТипОбъектов)

	ИмяТаблицы = Метаданные.НайтиПоТипу(ТипОбъектов).ПолноеИмя();

	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("ПустаяСсылка", ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ИмяТаблицы).ПустаяСсылка());

	Запрос.Текст =
	"ВЫБРАТЬ
	|	ТекущаяТаблица.Ссылка КАК Ссылка
	|ИЗ
	|	&ТекущаяТаблица КАК ТекущаяТаблица
	|ГДЕ
	|	ТекущаяТаблица.Родитель = &ПустаяСсылка";

	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТекущаяТаблица", ИмяТаблицы);
	Выборка = Запрос.Выполнить().Выбрать();

	КорневыеЭлементы = Новый Соответствие;
	Пока Выборка.Следующий() Цикл
		КорневыеЭлементы.Вставить(Выборка.Ссылка, Истина);
	КонецЦикла;

	Возврат КорневыеЭлементы;

КонецФункции

#КонецОбласти

#Иначе
	ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли